在solr中搜索特殊字符

eiee3dmh  于 2022-11-05  发布在  Solr
关注(0)|答案(3)|浏览(230)

我在solr中使用特殊字符进行搜索时遇到了问题。我的文档有一个字段“标题”,有时它可能像“泰坦尼克号- 1999”(它有字符“-”)。当我试图在solr中搜索“-”时,我收到了一个400错误。我已经尝试转义字符,所以我尝试了“-”和“-"这样的修改,solr没有用错误来回应我,但是它返回了0个结果。
我怎么能在solr管理搜索与特殊字符(像“-”或“'”的东西???
此致

UPDATE这里可以看到我当前的solr方案https://gist.github.com/cpalomaresbazuca/6269375

我的搜索是“标题”字段。

摘录自schema.xml:

...
 <!-- A general text field that has reasonable, generic
     cross-language defaults: it tokenizes with StandardTokenizer,
     removes stop words from case-insensitive "stopwords.txt"
     (empty by default), and down cases.  At query time only, it
     also applies synonyms. -->
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
             <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
             -->
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
    </fieldType>
...
<field name="Title" type="text_general" indexed="true" stored="true"/>
sg24os4d

sg24os4d1#

您正在为title属性使用标准的text_general字段。这可能不是一个好的选择。text_general适用于大块的文本(或至少是句子),而不太适用于名称或标题的精确匹配。
这里的问题是text_general使用了标准令牌工厂。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
             <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
             -->
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
    </fieldType>

StandardTokenizerFactory执行以下操作:
一个很好的通用标记器,它可以去除许多无关的字符,并将标记类型设置为有意义的值。标记类型仅对识别相同标记类型的后续标记筛选器有用。

这表示将完全忽略'-'字符,并将其用于标记字符串。

“功夫”将被表示为“孔”和“福”。“-”消失。
这也解释了为什么select?q=title:\-在这里不起作用。

选择更适合的字段类型:

您可以使用solr.WhitespaceTokenizerFactory来代替StandardTokenizerFactory,它只在空格上进行拆分,以便精确匹配单词。因此,为title属性创建自己的字段类型将是一个解决方案。
Solr还有一个名为text_ws的fieldtype。根据您的要求,这可能就足够了。

oxalkeyp

oxalkeyp2#

要搜索您的确切短语,请将其括起来:

select?q=title:"Titanic - 1999"

如果您只想搜索该特殊字符,则需要对其进行转义:

select?q=title:\-

另请检查:Special characters (-&+, etc) not working in SOLR Query
如果您确切地知道不想使用哪些特殊字符,则可以将其添加到regex-normalize.xml

<regex> 
  <pattern>&#x2D;</pattern> 
  <substitution>%2D</substitution> 
</regex>

这会将所有“-”替换为%2D,因此,在搜索时,只要搜索%2D而不是“-”,就可以正常工作

tv6aics1

tv6aics13#

我花了很多时间来完成这个。这里是一个清晰的一步一步的事情要做的查询特殊字符在SolR。希望它能帮助别人。
1.编辑schema.xml文件并找到您正在使用的solr.TextField。
1.在这两种情况下,“索引”和“查询”分析器修改WordDelimiterFilterFactory并添加types="characters.txt"类似于:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
 <analyzer type="index">
 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
</analyzer>
</fieldType>

1.请确保使用WhitespaceTokenizerFactory作为标记器,如上所示。
1.您的characters.txt文件可以包含以下条目-

\# => ALPHA
@ => ALPHA
\u0023 => ALPHA
                ie:- pointing to ALPHA only.

1.清除数据,重新索引,查询输入的字符,就可以了。

相关问题