我是索尔的新手,我面临着一个奇怪的问题。
当我搜索以“e”结尾的单词时,它始终不会返回任何结果。例如:
假设数据库上有“QWERTY”记录。 当搜索词是“QWERT”时,它返回记录“QWERTY”。 当搜索词为“QWERTY”时,它返回记录“QWERTY”。 (正确的)
假设DB上有一条记录“ABCDE”。 当搜索词是“ABCD”时,它返回记录“ABCDE”。 当搜索词是“ABCDE”时,它什么都不返回!!
我发现了一些与“solr忽略最后一封信”有关的问题以及类似的一些问题,但没有找到与此相关的内容。
我正在使用Solr 0。9。2。2(3年项目),Rails 3.2.2,Apache 2.2.22和Ubuntu 12.04 LTS
任何想法??
谢谢!
- Edit-- 架构: http://www.speedyshare.com/khdcr/schema.xml
查询: query_string =(“%”+ params [:nome] +“%”)。upcase produto_busca = Estoque :: Produto.of(current_empresa).where(“nome LIKE?或est_produtos.nome_fantasia LIKE?”,query_string,query_string).order(“nome ASC”)
有几个查询存在同样的问题。这只是一个例子。
答案 0 :(得分:2)
几周后,我找到了解决这个问题的方法。
Lucene Solr有一个名为Stemming的过滤器。此过滤器基本上捕获单词的“根”。它删除了一些字母,例如:
关于我的系统的关键点是:
解决方案是从Solr Schema中删除Stemming(solr / conf / schema.xml):
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type='index'>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
新代码基本上用“白色空格”分隔单词,将特殊字符更改为常规字符(á - &gt; a),将所有字母设置为小写字母(Aaa - &gt; aaa)并使用NGram过滤器(abc - &gt; ; ab bc abc ...)。
(参考文献:https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions)
希望这会有所帮助......
Ps:有几种语言的词干版本。