我是 Solr 的新手,我面临着一个奇怪的问题。
当我搜索以“e”结尾的单词时,它总是不返回任何结果。
假设 DB 上有一条记录“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
任何想法??
非常感谢。
--编辑--架构:http://www.speedyshare.com/khdcr/schema.xml
查询:query_string = ("%" + params [:nome] + "%").upcase produto_busca = Estoque::Produto.of (current_empresa).where ("nome LIKE?or est_produtos.nome_fantasia LIKE?",query_string,query_
有几个查询有同样的问题。这只是一个例子。
几周后,我找到了解决这个问题的方法。
Lucene Solr 有一个名为 Stemming 的过滤器。这个过滤器基本上捕获单词的“根”。它删除一些字母来做到这一点,例如:
包含-& gt;包含
组成-& gt;组成
构成-& gt;构成等...(参考http://snowball.tartarus.org/algorithms/english/stemmer.html)
关于我的系统的关键点是:
语言:葡萄牙语
不是索引全文,只是一些单词。
解决方案是从 Solr Schema(solr / conf / schema.xml)中删除 Stemming:
<fieldType name="text" cl="solr.TextField" omitNorms="false">
<yzer type='index'>
<tokenizer cl="solr.WhitespaceTokenizerFactory"/>
<filter cl="solr.ASCIIFoldingFilterFactory"/>
<filter cl="solr.LowerCaseFilterFactory"/>
<filter cl="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
</yzer>
<yzer type="query">
<tokenizer cl="solr.WhitespaceTokenizerFactory"/>
<filter cl="solr.ASCIIFoldingFilterFactory"/>
<filter cl="solr.LowerCaseFilterFactory"/>
</yzer>
</fieldType>
新代码基本上用“空格”分隔单词,将特殊字符更改为常规字符(á-& gt;a),将所有字母改为小写(Aaa-& gt;aaa)并使用 NGram 过滤器(abc-& gt;ab bc abc...)。
(参考:https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions)
希望这有帮助。。。
ps:有几种语言的 Stemming 版本。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(84条)