Solr查询模拟完全匹配

时间:2016-01-07 01:54:00

标签: search solr lucene

我使用solr与品牌进行简短查询。我想要平等的比赛,但要明白在Lucene中是不可能的。 我为测试尝试了一些硬编码查询

myBrand:2\+2 and myBrand:\+

我得到2:2,似乎和条件不起作用或不是我期待的方式?

另外,我试试fq

myBrand:2\+2 with a fq of myBrand:\+

现在,根本没有结果。

我使用Solr 5并在Solr Web界面中进行所有测试。 是否有一些方法可以获得一些短品牌,绰号等的最佳匹配,当我不需要太多的eristics并希望强大的平等匹配?或者无论如何,我必须在执行solr查询后在我自己的代码中过滤结果?

query by fields

query with filter

query with filter2

已更新

架构中的更改解决了我的问题。 现在它正在为查询2+2工作,就像魅力一样。

<fieldType name="text_general" class="solr.TextField" multiValued="true" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*"/>
    </analyzer>
</fieldType>

1 个答案:

答案 0 :(得分:2)

平等比赛并非不可能。您只需使用保留精确值的字段类型,例如StrField或带有KeywordTokenizer的TextField(如果您想使其不区分大小写)。

匹配将是field:"Exact value"或任何常规查询语法。 Solr / Lucene之所以没有做到这样的话,那就是&#34;确切的&#34; match是示例中的常规TextField定义将文本分成单独的标记。

对于过滤器,您通常需要精确值(对于构面和fq,因此您可以精确地过滤结果),因此这不是Lucene限制,而是由字段类型引入的内容你正在与之合作。

解决方案可能是在许多字段中使用相同的内容(一个用于搜索常规文本查询),另一个用于过滤和分面。使用copyField将相同的值从同一源字段中的多个字段中获取。