【问题标题】:Solr query must match all words/tokens in a fieldSolr 查询必须匹配字段中的所有单词/标记
【发布时间】:2012-05-08 23:49:04
【问题描述】:

我的schema.xml 中有一个名为name 的文本字段。查询 q=name:(organic) 返回以下文档:

<doc>
    <str name="id">ontology.category.1483</str>
    <str name="name">Organic Products</str>
</doc>
<doc>
    <str name="id">ontology.keyword.4896</str>
    <str name="name">Organic Stores</str>
</doc> 

这在普通的 Solr 搜索中是完全正确的,但是我想构造查询,使其不返回任何内容,因为 'organic' 仅匹配 1字段中可用的 2 个单词中的一个。

更好的说法是:仅当字段中的所有标记都匹配时才返回结果。因此,如果一个字段中有两个单词(标记)并且我只匹配 1 ('organic','organics','organ'等)我不应该得到匹配,因为只有 50% 的字段已被搜索。

这在 Solr 中可行吗?如何构建查询?

【问题讨论】:

    标签: solr


    【解决方案1】:

    您可能正在使用 StandardTokenizerFactory(或类似的东西),一种解决方案是使用 KeywordTokenizerFactory 并发出短语查询,然后只有完美匹配才会起作用。当然请记住您可能想要使用的其他过滤器(例如 LowerCaseFilterFactory 等)。请注意:“商店有机”也不会匹配您的文档

    【讨论】:

    • 嗨,raticulin,我会使用 KeywordTokenizerFactory,但我需要在现场进行词形还原。例如。 “有机商店”必须点击“有机商店”等。
    【解决方案2】:

    由于时间限制,我不得不求助于以下(hacky)解决方案。

    我通过名为 tc_i 的 DynamicField 字段将术语计数添加到索引中。

    <dynamicField name="*_i" type="int" indexed="true" stored="true"/>
    

    现在在查询时,我计算条款并将其附加到查询中,因此 q=name:(organic) 变为 q=name:(organic) AND tc_i:(1) 并且这显然不会返回“有机商店”/“有机产品”的文档,因为它们的 tc_i 字段设置为 2(两个字)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多