我正在使用 apache solr 搜索引擎来索引我的网站数据库..
我正在使用 django+ http://haystacksearch.org/
因此,假设我有包含“鸡”字样的文件
当我搜索“鸡”时 - solr 可以找到这个文档
但是当我搜索“小鸡”时 - 它什么也没找到..
有没有办法解决这个问题 ?
我正在使用 apache solr 搜索引擎来索引我的网站数据库..
我正在使用 django+ http://haystacksearch.org/
因此,假设我有包含“鸡”字样的文件
当我搜索“鸡”时 - solr 可以找到这个文档
但是当我搜索“小鸡”时 - 它什么也没找到..
有没有办法解决这个问题 ?
注意:以下解决方案是 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>
如果要查找所有以chick 开头的单词,请搜索chick*。
当我用过
<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" />
(默认标记器 - FieldType 索引块中的 solr.WhitespaceTokenizerFactory)。对我来说,结果是相同的,但系统成本更低。
如果您在使用少量单词时遇到问题,另一种方法是使用 solr.SynonymFilterFactory
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory
您只需要维护一个包含同义词的简单文本文件:
chick peep chicken
dawg hound dog
moggie puss kitten cat
复数应该用其他过滤器照顾自己。
我没有更改任何配置。我只是在我的searchString的前面和后面使用星号:*chicke *(末尾没有空格->这是因为如果您在开头和结尾使用*,则将单词格式化为斜体)