我对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"/>发布于 2015-03-02 18:20:02
您正在使用标准的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做了以下工作:
一个很好的通用标记器,它剥离了许多无关字符,并将令牌类型设置为有意义的值。令牌类型仅适用于对同一令牌类型具有类型感知的后续令牌筛选器。
--这意味着'-‘字符将被完全忽略,并用于标记字符串.
“孔夫子”将分为“孔”和“福”两种。“-”消失了。
这也解释了为什么select?q=title:\-不能在这里工作。
选择一种更好的拟合字段类型:
而不是StandardTokenizerFactory,您可以使用solr.WhitespaceTokenizerFactory,它只在空格上拆分,以实现单词的精确匹配。因此,为title属性创建您自己的字段类型将是一个解决方案。
Solr还有一个名为text_ws的字段类型。根据您的需求,这可能就足够了。
发布于 2013-08-19 14:23:09
要搜索你的确切短语,在它周围加上引号:
select?q=title:"Titanic - 1999" 如果您只想搜索这个特殊字符,那么您需要转义它:
select?q=title:\-如果您确切地知道您不想使用哪些特殊字符,那么可以将其添加到regex-Norize.xml中。
<regex>
<pattern>-</pattern>
<substitution>%2D</substitution>
</regex>这将将所有"-“替换为%2D,因此,当您搜索时,只要搜索%2D而不是"-”,它就会正常工作。
发布于 2016-07-27 07:51:45
我花了很多时间来完成这件事。以下是SolR中查询特殊字符的一步一步的明确步骤。希望它能帮到别人。
WordDelimiterFilterFactory并添加types="characters.txt",如下所示:https://stackoverflow.com/questions/18277609
复制相似问题