2013-08-16 168 views
7

我在索尔特殊字符搜索时遇到问题。 我的文档有一个字段“标题”,有时它可以像“泰坦尼克号 - 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"/> 
+0

当您搜索时,是否将引号括起来?像选择?q =标题:“泰坦尼克号 - 1999”。把它放在引号中应该做一个确切的搜索 –

+0

你的模式在这个领域看起来像什么?我很想知道你对这个领域有什么样的定义。 –

+0

<字段名=“标题”类型=“text_general”存储=“真正的”索引=“真” /> –

回答

0

要搜索您的确切词组放在引号围着它

select?q=title:"Titanic - 1999" 

如果你只是想搜索特殊字符,那么你将需要转义:

select?q=title:\- 

另请检查: Special characters (-&+, etc) not working in SOLR Query

如果您确切地知道当你搜索,你只要搜索与%2D%,所以 - 这特殊字符,您不想使用,那么你可以添加这对正则表达式,normalize.xml

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

这将替换所有“” 2D而不是“ - ”它会正常工作

+0

我已经试过: 选择Q =冠军?:\ - 但它仍然返回0结果:( 我怎么能知道如果字符“ - ”没有被收录? – shinjidev

+0

尽我建议在下半场,改变正则表达式,normalize.xml。我尝试过自己和它完美 –

+0

遗憾的问题,但我在哪里可以找到这个文件???我找不到它 – shinjidev

7

您正在使用title属性的标准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的最小字段类型。根据您的要求,这可能就足够了。

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. 清除数据,重新编制索引并查询输入的字符。它 将工作。