Apache solr搜索部分单词

时间:2009-12-29 12:28:51

标签: django solr django-haystack django-search-lucene

我正在使用apache solr搜索引擎索引我的网站数据库..

我正在使用django + http://haystacksearch.org/

所以,假设我的文件中有“鸡”字样

当我搜索“鸡”时,solr可以找到这个文件

但是当我搜索“小鸡”时 - 它找不到任何东西......

有没有办法解决这个问题?

5 个答案:

答案 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格式化单词为斜体)