8

我在 solr 中搜索特殊字符时遇到问题。我的文档有一个“标题”字段,有时它可能像“泰坦尼克号 - 1999”(它有字符“-”)。当我尝试使用“-”在 solr 中搜索时,我收到 400 错误。我试图逃避这个角色,所以我尝试了“-”和“\-”之类的东西。有了这些更改,solr 不会以错误响应我,但它会返回 0 个结果。

我如何使用该特殊字符在 solr 管理员中进行搜索(例如“-”或“'”?

问候

更新 在这里你可以看到我当前的 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"/>
4

3 回答 3

9

您正在使用text_general标题属性的标准字段。这可能不是一个好的选择。text_general旨在用于大量文本(或至少是句子),而不是用于名称或标题的精确匹配。

这里的问题是text_general使用StandardTokenizerFactory

 <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执行以下操作:

一个很好的通用标记器,可以去除许多无关字符并将标记类型设置为有意义的值。标记类型仅对识别相同标记类型的后续标记过滤器有用。

这意味着“-”字符将被完全忽略并用于标记字符串。

“kong-fu”将表示为“kong”和“fu”。'-' 消失。

这也解释了为什么select?q=title:\-在这里不起作用。

选择更合适的字段类型:

StandardTokenizerFactory您可以使用,而不是solr.WhitespaceTokenizerFactory, 仅在空格上拆分以精确匹配单词。因此,为 title 属性创建自己的字段类型将是一个解决方案。

Solr 还有一个名为text_ws. 根据您的要求,这可能就足够了。

于 2015-03-02T18:20:02.380 回答
1

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

select?q=title:"Titanic - 1999" 

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

select?q=title:\-

还要检查: 特殊字符(-&+ 等)在 SOLR 查询中不起作用

如果您确切知道不想使用哪些特殊字符,则可以将其添加到 regex-normalize.xml

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

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

于 2013-08-19T14:23:09.203 回答
1

我花了很多时间来完成这件事。这是在 SolR 中查询特殊字符需要做的明确的分步操作。希望它可以帮助某人。

  1. 编辑 schema.xml 文件并找到您正在使用的 solr.TextField。
  2. 在两者下,“索引”和查询“分析器修改 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>
    
  3. 确保使用 WhitespaceTokenizerFactory 作为分词器,如上所示。

  4. 您的 characters.txt 文件可以包含以下条目 -

     \# => ALPHA
    @ => ALPHA
    \u0023 => ALPHA
                    ie:- pointing to ALPHA only.
    
  5. 清除数据,重新索引和查询输入的字符。它会起作用的。

于 2016-07-27T07:51:45.357 回答