查询两个字段相等的文档?

时间:2013-04-28 01:24:50

标签: solr lucene

solr中有两个文本字段,它们都是白色空格标记化并具有小写过滤器。下面是架构:

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

<field name="field1" type="text_ac" indexed="true" stored="true" required="false" omitNorms="true" default=""/>

<field name="field2" type="text_ac" indexed="true" stored="true" required="false" omitNorms="true" default=""/>

如何在查询时(field1 == field2)查询solr返回整个字符串field1与field2相同的结果?

感谢。

3 个答案:

答案 0 :(得分:9)

据我所知,在Solr或Lucene核心中不支持将一个字段与另一个字段进行比较。

实现此目的的一种简单方法是在索引时执行比较,并将结果存储在索引中。也就是说,如果您有field1field2,请创建一个字段1_equals_2,并使用true对其进行索引,如果它们在添加文档时基于您的比较相等。然后,您只需搜索1_equals_2:true

答案 1 :(得分:2)

方法1-范围解析器

如@dduo所述,您可以使用https://lucene.apache.org/solr/guide/6_6/other-parsers.html#OtherParsers-FunctionRangeQueryParser。这是Trey Grainger(Solr in Action的作者之一)说的做到这一点的方法:

q=*:*&fq={!frange l=1 u=1 v=$equals}&equals=if(eq(field1,field2),1,0)

我对此进行了测试,它在大约10秒钟的查询中就处理了1.4亿个文档,结果集达到60万。

这可以工作,但是有点慢。

方法2-使用流表达式

以下表达式似乎可以完成我们在这里想要做的事情:

having(search(your_collection_name, q="*:*", sort="id asc"), eq(field1, field2))

由于返回即时结果,因此似乎性能更高。因此,如果您可以使用流表达式,这可能是获取所需内容的更快方法。

答案 2 :(得分:1)

您是否尝试过'strdist'和范围查询'frange'功能?像这样的范围查询会有所帮助:

{!frange l = 1 u = 1} strdist(field1,field2,edit)