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

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

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

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

【问题讨论】:

    标签: search solr


    【解决方案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

      【讨论】:

      • 谢谢汉克,也许我应该更恰当地表达我的问题,如何禁用词干提取? :)
      • 有时重新索引可能会很痛苦,尤其是在大数据上花费很长时间的情况下。除了关闭词干之外,还有其他方法吗?
      【解决方案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" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-05
          • 1970-01-01
          • 2014-06-09
          • 1970-01-01
          • 2013-10-07
          • 1970-01-01
          • 1970-01-01
          • 2018-12-07
          相关资源
          最近更新 更多