我正在使用apache solr搜索引擎索引我的网站数据库..
我正在使用django + http://haystacksearch.org/
所以,假设我的文件中有“鸡”字样
当我搜索“鸡”时,solr可以找到这个文件
但是当我搜索“小鸡”时 - 它找不到任何东西......
有没有办法解决这个问题?
答案 0 :(得分:18)
注意:以下解决方案是Solr 1.4 (及以上)具体!
为了获得更大的灵活性,我建议您使用NGramTokenizerFactory索引数据,以完成前后通配符搜索。如果您只想在字符串的开头或结尾搜索子字符串,请考虑使用EdgeNGramTokenizerFactory。
这里有一个替代文本字段类型,可以满足您的需求:
<fieldType name="text" class="solr.TextField" >
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
答案 1 :(得分:7)
如果您想查找以小鸡开头的所有单词,请搜索小鸡*。
答案 2 :(得分:4)
当我使用
时<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
根据Brian的回答进行通配符搜索,Solr索引时间显着增加。超过20次! 我在这里找到了另一个通配符搜索问题的决定:
http://www.lucidimagination.com/blog/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/
您只需添加过滤器
即可<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
(默认的tokenizer - FieldType的索引块中的solr.WhitespaceTokenizerFactory)。对我来说,结果是相同的,系统成本更低。
答案 3 :(得分:1)
另一种方法是,如果你遇到一小部分单词,就会使用solr.SynonymFilterFactory
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory
您只需维护一个包含同义词的简单文本文件:
chick peep chicken
dawg hound dog
moggie puss kitten cat
复数应该使用其他过滤器来处理。
答案 4 :(得分:0)
我没有改变任何配置。我只是在我的searchString前面和后面使用星号:* chicke *(最后没有空白区域 - &gt;因为如果你在开头和结尾使用*,所以因为SO格式化单词为斜体)