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相同的结果?
感谢。
答案 0 :(得分:9)
据我所知,在Solr或Lucene核心中不支持将一个字段与另一个字段进行比较。
实现此目的的一种简单方法是在索引时执行比较,并将结果存储在索引中。也就是说,如果您有field1
和field2
,请创建一个字段1_equals_2
,并使用true
对其进行索引,如果它们在添加文档时基于您的比较相等。然后,您只需搜索1_equals_2:true
。
答案 1 :(得分:2)
如@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万。
这可以工作,但是有点慢。
以下表达式似乎可以完成我们在这里想要做的事情:
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)