Solr Fuzzy搜索相似的单词

时间:2012-03-27 03:50:57

标签: solr fuzzy-search

我正在尝试模糊搜索“jahngir”~0.2,这不会返回任何结果。我的索引记录了数据“JAHANGIR RAHMAN MD”。如果我尝试使用确切的单词“jahangir”~0.2进行搜索,它就可以了。关于我做错了什么,有人可以帮忙吗?我花了很多时间试图弄清楚Solr Fuzzy搜索是如何工作的。任何解释Solr模糊搜索的链接都会有所帮助。下面是我用于索引的文本字段。提前谢谢。

 <fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
      add enablePositionIncrements=true in both the index and query
      analyzers to leave a 'gap' for more accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
</fieldType>

以下是响应后对我有用的配置。谢谢!

<!-- Modified to fit fuzzy queries -->  
    <fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false">
      <analyzer type="index">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StandardFilterFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

2 个答案:

答案 0 :(得分:19)

不,你不需要启用词干,使用词干分析器可能会导致问题。

文本字段上有太多过滤器。你正在将一个单词转换为一个Porter词干,这通常不是一个真正的单词,然后取出它的语音键。表面词很少与索引中存储的语音键匹配。语音键与原始词非常不同。

使用管理界面中的分析器页面查看术语的处理方式。

我建议将近似匹配的种类分成不同的字段。

  • text_exact:小写,就是它
  • text_stem:小写和词干
  • text_phonetic:小写和双音译,不要干

将模糊匹配与text_exact一起使用,因为它处理输入错误。不要对其他字段使用模糊。

您可以对这些字段进行不同的加权,完全匹配是比其他字段更高质量的匹配,因此它可以具有更大的权重。词干匹配比拼音更匹配,所以它的重量应该小于精确,但大于拼音。

答案 1 :(得分:0)

为了使模糊搜索起作用,您需要为所需语言启用正确的词干和/或过滤工厂。有关详细信息,请参阅Langauge Analysis上的Solr Wiki主题。

修改:有关索引数据的不同方式及其对数据搜索的影响方式的详细信息,请参阅Analyzers, Tokenizers and Token Filters