【问题标题】:Solr query only match if all tokens present in the querySolr 查询仅在查询中存在所有标记时匹配
【发布时间】:2014-07-13 12:20:52
【问题描述】:

我正在使用 solr 4.9.0 实现 solr 搜索。

我希望 solr 返回与我的所有查询关键字匹配的结果,而不仅仅是一个或几个。

在放弃示例之前让我先提出架构

<field name="id" type="string" indexed="true" stored="true" required="true"/>
<field name="title" type="text_general" indexed="true" stored="true" required="true"/>
<field name="at" type="string" indexed="true" stored="true" required="true"/>
<field name="rt" type="custom1" indexed="true" stored="true" required="true"/>
<field name="st" type="custom1" indexed="true" stored="true" required="true"/>

我对所有这些都有一个 copyField(如果这很重要的话)

<copyField source="id" dest="text"/>
<copyField source="title" dest="text"/>
<copyField source="at" dest="text"/>
<copyField source="rt" dest="text"/>
<copyField source="st" dest="text"/>

和“custom1”字段类型,我定义如下:

<fieldType name="custom1" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

fieldType 可能没有意义,因为我尝试了很多组合以获得我想要的结果。

这些字段可以具有以下值:

标题 - 可以包含任何内容 at - 女孩房间, 单身公寓, Co-aid 宿舍 rt - 1 共享,3 共享,单座 st - 1 BHK, 3 BHK

现在,如果我查询“roselum city 的 1 BHK flat”,我希望结果只有 st 为“1 BHK”,而其他结果包含 title 中的关键字。

但是我也得到了 rt = "1sharing" 的结果和 st = "3 BHK" 的结果,因为我的查询包含 1 和 BHK 并且它匹配包含其中任何一个的所有内容,即; “1”或“BHK”或查询中我不想要的任何其他关键字。

我搜索了相关问题并找到了一些有希望的答案,但没有一个有效:

这是我已经尝试过的:
1.Performing EXACT match on SOLR search 这个答案完全符合我的问题,但即使遵循每一步,我也无法做到。
2.我加了&lt;solrQueryParser defaultOperator="AND"/&gt; 到我的 schema.xml 以强制查询遵循 AND 规则,但它也不起作用。
3. 将&lt;str name="mm"&gt;100%&lt;/str&gt; 添加到我的“/query” requestHandler 中的 solrConfig.xml 以匹配 100% 的关键字,但这也让我感到绝望。

我想要的几乎等于 fredseagul(第一点)在他的问题中引用的内容。

任何可以详细说明整个事情的专家,请介入。

注意:我只想通过修改架构/任何其他配置来实现所有这些,不想进行复杂的查询。只有在 strtat 字段中包含所有关键字的结果才应返回。 title字段是一个例外,如果查询中的任何一个关键字与title关键字匹配,则应返回该结果。


请不要将其标记为重复。我已经搜索了很多。

【问题讨论】:

    标签: solr lucene keyword tokenize


    【解决方案1】:

    你有一堆问题:

    1. 您的 custom1 字段定义已完全损坏。目前,如果您在 custom1 定义的文本中有一个大写单词,它将永远不会被匹配,因为只有小写单词才会匹配。您应该使用 Admin WebUI 中的“分析”选项卡来查看定义的作用。
    2. 但这可能无关紧要,因为您正在执行 copyField 并且可能默认搜索“文本”字段。这意味着只有 text 字段的类型很重要。

    我建议先退后一步,先做一些练习/教程。您很可能希望将 eDismax 与字段列表和 mm=100% 一起使用。而且没有copyText。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多