【问题标题】:Solr Wildcards Scoring and NGramFIlterFactorySolr 通配符评分和 NGramFIlterFactory
【发布时间】:2021-07-13 13:06:51
【问题描述】:

在 Solr 中使用通配符搜索时,文档似乎没有得分。 考虑我的索引中有以下包含名字的文档,并按此顺序对它们进行索引:

  1. 迈克尔
  2. 迈克尔森
  3. 迈克尔

搜索名字“Michael*”并将结果大小限制为 2 会返回前两个。但显然第 3 个人比第 2 个人更适合我的搜索。我应该在这里做什么?我可以通过使用 NGramFilterFactory 并省略通配符来解决这个问题吗?

【问题讨论】:

  • 首先进行完全匹配...如果您得到的结果较少,则进行通配符搜索
  • 有两个字段,一个用于评分精确匹配,一个用于 ngramfiltered 结果。
  • @AbhijitBashetti 我该怎么做?

标签: java solr solrj


【解决方案1】:

您可以通过使用基于 EdgeNGramFilterFactory 的分析器将您的字段“first_name”复制到其他字段中来解决此类问题,该问题与自动完成问题非常相似,并将索引: 米 米 麦克风 密歇根州 米查 米凯 迈克尔

使用:

<field name="first_name" type="text_general" indexed="true" stored="true" required="true" multiValued="false"/>
<copyField source="first_name" dest="textnge"/>
<field name="textnge" type="autocomplete_edge" indexed="true" stored="false" />
<field name="textng" type="autocomplete_ngram" indexed="true" stored="false" />

    <fieldType name="autocomplete_edge" class="solr.TextField">
        <analyzer type="index">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([\.,;:-_])" replacement=" " replace="all"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="1"/>
        </analyzer>
        <analyzer type="query">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    <fieldType name="autocomplete_ngram" class="solr.TextField">
        <analyzer type="index">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="1"/>
        </analyzer>
        <analyzer type="query">
            <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

然后你可以像这样配置你的查询处理程序:

  <requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="defType">edismax</str>
      <str name="qf">first_name^30 textnge^100.0 textng^20.0</str>
    </lst>

因此,精确匹配比部分匹配更重要,并且第一个单词的边缘也比另一个单词的部分匹配更重要。

【讨论】:

  • 我正在使用复句。如果我现在搜索部分字符串,我再也找不到任何结果了。
  • 添加了另一个分析器,用于匹配第一个之外的单词
  • 有效!谢谢你的回答。我将其标记为正确。你也知道如何解决这个问题吗? stackoverflow.com/questions/67191819/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2011-12-24
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多