【问题标题】:Apache solr search part of the wordApache solr 搜索部分单词
【发布时间】:2014-12-18 02:10:49
【问题描述】:

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

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

假设我有包含单词“Chicken”的文档

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

但是当我搜索“chick”时 - 它什么也没找到..

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

【问题讨论】:

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


    【解决方案1】:

    注意:以下解决方案是 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>
    

    【讨论】:

    • solr 1.5 - 这是开发版本吗? (未发布?)
    • 1.4 有这样的解决方案吗?
    • 这真的很有用......我个人认为我会创建一个像上面这样的新字段类型......但称为 ntext 或其他东西......只是这样你就不会弄乱原始文本字段类型。
    • NGramTokenizerFactory 非常适合我(即使是 1.3 版本)
    【解决方案2】:

    如果要查找所有以chick 开头的单词,请搜索chick*。

    【讨论】:

    • 我无法使用*chick*?有可能吗?
    • @soundar,这是一个 bad 小鸡 ;) 你不能在搜索关键字前加上 *,Lucene 不支持。
    【解决方案3】:

    当我用过时

    <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)。对我来说,结果是相同的,但系统成本更低。

    【讨论】:

      【解决方案4】:

      如果您在使用少量单词时遇到问题,另一种方法是使用 solr.SynonymFilterFactory

      http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

      您只需维护一个包含同义词的简单文本文件:

      chick peep chicken
      dawg hound dog
      moggie puss kitten cat
      

      复数应该使用其他过滤器来照顾自己。

      【讨论】:

        【解决方案5】:

        我没有更改任何配置。我只是在我的searchString的前面和后面使用星号:*chicke *(末尾没有空格->这是因为如果您在开头和结尾使用*,则将单词格式化为斜体)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多