Solr 精确词搜索

Posted

技术标签:

【中文标题】Solr 精确词搜索【英文标题】:Solr exact word search 【发布时间】:2011-02-07 12:31:31 【问题描述】:

我想配置我的 Solr 搜索引擎,以便我输入的搜索词完全匹配。

例如。 “taxes”应该返回带有“taxes”而不是“tax”、“taxation”等的文件。

任何帮助或提示将不胜感激。

【问题讨论】:

【参考方案1】:

我假设您的字段是 TextField,默认情况下 solr 会在此字段上进行模糊搜索。您想要的是将您的字段设置为字符串字段并且不添加标记器,然后您将获得完全匹配。

您甚至可以将精确搜索与模糊搜索结合起来,并使用 DisMax 来提高相对权重。

示例(schema.xml):

<field name="name"             type="string" indexed="true" stored="false" required="true" />
<field name="nameString"       type="string" indexed="true" stored="false" required="true" />
<copyField source="name" dest="nameString"/>

示例(solrconfig.xml):

<requestHandler name="accounts" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="defType">dismax</str>
      <str name="qf">
        nameString^10.0 name^5.0 description^1.0
      </str>
      <str name="tie">0.1</str>
    </lst>
  </requestHandler>

【讨论】:

这可以在查询时使用特殊运算符吗?喜欢=税 @mlissner,上面的 XML 只是添加到查询中的默认参数。你可以通过添加到您的查询 defType=dismax&qa=nameString^10.0 name^5.0 description^1.0 etc etc 来做到这一点 @ItayMoav,目标是让 用户 能够放置完全匹配的查询。 是的,我理解你。如果你知道你可以将这些参数添加到查询中,你可以在上面放置一个 UI 来生成查询...【参考方案2】:

要关闭 schema.xml 中的词干提取,您可以像这样定义文本字段:

<types>

   <!-- other fields definition -->

   <fieldType name="text_no_stem" class="solr.TextField" omitNorms="false">
      <analyzer>
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StandardFilterFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
   </fieldType>

   <!-- other fields definition -->

</types>

<fields>

   <!-- other fields definition -->

   <dynamicField name="*_nostem" type="text_no_stem" indexed="true" stored="true"/>

   <!-- other fields definition -->

</fields>

我正在使用sunspot 将 solr 与 Ruby on Rails 集成。在 schema.xml 中,我定义了我的可搜索块,如下所示:

searchable do
    text(:wants, as: :wants_nostem)
end

【讨论】:

【参考方案3】:

关闭stemming。

【讨论】:

谢谢汉克,也许我应该更恰当地表达我的问题,如何禁用词干提取? :) 见lucene.472066.n3.nabble.com/… 有时重新索引可能会很痛苦,尤其是在大数据上花费很长时间的情况下。除了关闭词干之外,还有其他方法吗?【参考方案4】:

使用引号获得完全匹配的结果:

例子:

核心名称:core1 键:名称字符串

http://localhost:8983/solr/core1/select?q=namestring:"taxes"&wt=json&indent=true

【讨论】:

【参考方案5】:

使用 solr 字符串字段,该字段将执行精确值搜索,例如

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

【讨论】:

以上是关于Solr 精确词搜索的主要内容,如果未能解决你的问题,请参考以下文章

具有精确词匹配搜索的 RDD 过滤器

初识ElasticSearch -文档查询之term精确查询

初识ElasticSearch -文档查询之term精确查询

小白学习-ElasticSearch教程 -文档查询之term精确查询

es对中文进行精确查询

Lucene+Solr+ElasticSearch查询匹配优化