代码之家  ›  专栏  ›  技术社区  ›  flow

如何配置solr/lucene执行levenshtein编辑距离搜索?

  •  3
  • flow  · 技术社区  · 14 年前

    我在一个非常简单的SOLR/Lucene数据库中放了一长串单词。我的目标是从单词查询列表中找到“相似”词,其中“相似性”被明确理解为(damerau)levensinedit distance。我知道SOLR为拼写建议提供了如此大的距离。

    schema.xml ,我已配置字段类型 string :

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    

    <field name='term' type='string' indexed='true' stored='true' required='true'/>
    

    我想搜索这个字段并根据它们的levenshtein编辑距离返回结果。但是,当我运行 webspace~0.1 与SOLR的调试和解释相反,报告显示计算分数时考虑了很多因素,例如:

    "1582":"
    1.1353534 = (MATCH) sum of:
      1.1353534 = (MATCH) weight(term:webpage^0.8148148 in 1581), product of:
        0.08618848 = queryWeight(term:webpage^0.8148148), product of:
          0.8148148 = boost
          13.172914 = idf(docFreq=1, maxDocs=386954)
          0.008029869 = queryNorm
        13.172914 = (MATCH) fieldWeight(term:webpage in 1581), product of:
          1.0 = tf(termFreq(term:webpage)=1)
          13.172914 = idf(docFreq=1, maxDocs=386954)
          1.0 = fieldNorm(field=term, doc=1581)
    

    idf s等等是没有意义的,因为每个文档只包含一个术语。我试图使用拼写建议组件,但未能使其返回实际的相似性分数。

    任何人都能提供如何配置SOLR来执行leventhin/jaro winkler/n-gram搜索的提示吗 没有 做一些额外的事情,比如 tf , 以色列国防军 , boost 包括在内?有没有SOLR的简单配置示例?我发现选择的数量确实令人望而生畏。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Karl Johansson    14 年前

    如果使用的是夜间生成,则可以使用strdist函数根据levenshtein距离对结果进行排序:

    q=term:webspace~0.1&sort=strdist("webspace", term, edit) desc
    

    更多细节 here here

        2
  •  1
  •   Mikos    14 年前

    Solr/Lucene似乎不适合此应用程序。你可能过得更好。具有 SimMetrics library . 它提供了一套完整的字符串距离计算器,包括Jaro Winkler,Levenstein等。

        3
  •  1
  •   ilinca    10 年前

    如何配置SOLR以执行leventhein/jaro winkler/n-gram tf,idf,boost等等?

    q={!func}strdist("webspace",term,edit) 将用Levenstein距离和 q={!func}strdist("webspace",term,jw) 对Jaro Winkler也一样。

    看看哪个最适合 &debugQuery=true 可能就够了。