在solr中搜索特殊字符

时间:2013-08-16 16:04:00

标签: search solr lucene full-text-search special-characters

我在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"/>

3 个答案:

答案 0 :(得分:7)

您正在使用标准属性的标准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执行以下操作:

  

一个很好的通用标记器,剥离了许多无关的   字符并将标记类型设置为有意义的值。令牌类型是   仅对后续的类型感知的令牌过滤器有用   相同的令牌类型。

这意味着&#39; - &#39;字符将被完全忽略并用于标记字符串。

  

&#34;孔福&#34;将被表示为&#34; kong&#34;和&#34; fu&#34;。 &#39; - &#39;消失。

这也解释了select?q=title:\-为何在这里工作的原因。

选择更合适的字段类型:

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

Solr还有一个名为text_ws的最小字段类型。根据您的要求,这可能就足够了。

答案 1 :(得分:1)

我花了很多时间完成这项工作。以下是在SolR中查询特殊字符时要做的明确的逐步操作。希望它可以帮到某人。

  1. 编辑schema.xml文件并找到您所在的solr.TextField 使用。
  2. 在两者之下,&#34;索引&#34;和查询&#34;分析器修改 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. 清除数据,重新索引和查询输入的字符。它 会工作的。

答案 2 :(得分:0)

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

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而不是“ - ”就可以正常工作