4

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=""/>

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

谢谢。

4

3 回答 3

11

有关如何正确查询 Solr 两个字段之间的相等性,请参阅Nicholas DiPiazza 的答案

鉴于问题指定比较两个文本(即分析)字段的全部内容,我认为这不适用于函数查询等,因此有两种方法:

  • 重新考虑您要做什么,或更改索引结构。这些应该是字符串而不是文本吗?如果是这样,那么请如上所述参考Nicholas DiPiazza 的回答

  • (此处的原始答案)实现此目的的一种简单方法是在索引时执行比较,并将结果存储在索引中。也就是说,如果你有field1field2,创建一个字段1_equals_2,并用 索引它true,如果它们相等,则在添加文档时根据你的比较。然后,您可以简单地搜索1_equals_2:true.

于 2013-04-29T20:45:12.380 回答
7

方法 1 - frange 解析器

正如@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 亿个文档的集合,结果集中有 600,000 个文档。

所以这行得通,但它有点慢。

方法 2 - 使用流式表达

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

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

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

于 2019-10-10T03:01:21.300 回答
4

你试过函数'strdist'和范围查询'frange'吗?像这样的范围查询会有所帮助:

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

于 2014-03-14T14:40:18.993 回答