【问题标题】:Solr Fuzzy Search for similar wordsSolr 模糊搜索相似词
【发布时间】:2012-03-27 03:50:56
【问题描述】:

我正在尝试对“jahngir”~ 0.2 进行模糊搜索,但不会返回任何结果。我的索引有数据“JAHANGIR RAHMAN MD”的记录。如果我尝试使用确切的单词“jahangir”~ 0.2 进行搜索,它会起作用。有人可以帮忙,我做错了什么。我花了很多时间试图弄清楚 Solr 模糊搜索是如何工作的。任何解释 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>

【问题讨论】:

  • 您使用的查找实现是什么? FST、WFST 还是 Jaspell?
  • 您是如何向 Solr 发送请求的?您定义了一个 或者您正在通过“选择”端点发送?
  • Chiron - 使用选择端点发送请求。

标签: solr fuzzy-search


【解决方案1】:

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

文本字段的过滤器太多。您正在将一个词转换为一个 Porter 词干,这通常不是一个真实的词,然后取它的音标。表面词很少会匹配索引中存储的语音键。音标会和原词有很大的不同。

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

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

  • text_exact:小写,就是这样
  • text_stem:小写和词干
  • text_phonetic:小写和双变音位,不要词干

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

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

【讨论】:

  • 非常感谢!你一针见血。我花了很多时间试图弄清楚模糊搜索和相似因子如何与 Solr 一起工作。您建议将其拆分为不同的字段类型,并使用 text_exact 匹配进行模糊搜索,有助于更好地了解其工作原理!
  • Ravi,你能分享一下你的最终配置吗?
  • 这是我的最终配置。
【解决方案2】:

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

编辑:请参阅Analyzers, Tokenizers and Token Filters,详细了解索引数据的不同方式以及这对数据搜索有何影响。

【讨论】:

  • 感谢您的回复。很高兴知道词干过滤器工厂会影响模糊搜索。在上面的字段中,我已经在使用 PorterStemFilterFactory。我应该将其更改为其他内容吗?可能影响模糊搜索的其他因素是什么。
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 2013-02-18
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2016-02-01
相关资源
最近更新 更多