Solr查询仅匹配查询中存在的所有令牌

时间:2014-07-13 12:20:53

标签: solr lucene keyword tokenize

我正在使用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 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”filedType,我已将其定义如下:

<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可能没有任何意义,因为我尝试了很多。

字段可以包含以下值:

标题 - 可以包含任何内容 在 - 女孩的房间,单身公寓,辅助宿舍 rt - 1分享,3分享,单座 st - 1 BHK,3 BHK

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

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

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

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

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

任何能够详细阐述整件事的专家,请介入。

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


请不要将其标记为重复。我经常搜索它。

1 个答案:

答案 0 :(得分:0)

这里有一堆问题:

  1. 您的custom1字段定义已完全中断。目前,如果文本中的大写单词具有custom1定义,则永远不会匹配,因为只有小写单词才会匹配。您应该使用Admin WebUI中的Analyze选项卡查看定义的作用。
  2. 但这可能无关紧要,因为你正在做copyField并且可能正在搜索文本&#39;字段为默认值。这意味着只有文字字段的类型。
  3. 我建议先退后一步做一些练习/教程。您最有可能希望将eDismax与字段列表一起使用,mm = 100%。而且没有copyText。

相关问题