elasticsearch span_near query false hits

时间:2017-09-01 12:19:18

标签: regex elasticsearch lucene

我有一个文本字段,其中包含一个xml文档,我尝试找到这种匹配:

<Payer> [...] bic=\"123456789\" [...] </Payer>

使用以下查询:

{
    "query": {
        "span_near" : {
            "clauses" : [
            { "span_term" : { "field" : "payer" }},
            { "span_term" : { "field" : "bic" }},
            { "span_term" : { "field" : "123456789" }},
            { "span_term" : { "field" : "payer"}}
            ],
            "slop" : 500,
            "in_order" : true
        }
    }
}

问题是,如果xml-document包含以下内容,有时会出现错误匹配:

<Payer>bic=\"111111111\"</Payer><Payee>bic=\"123456789\"</Payee><Payer>bic=\"222222222\"</Payer>

查询找到PayeE而不是PayeR。从elastic的角度来看,它仍然有效。

我可以阻止这种“贪婪”搜索吗?

据我所知,this主题regexp不是一个选项,因为“ Elasticsearch(和lucene)不支持完全与Perl兼容的正则表达式语法”。这意味着regexp-query匹配令牌,而不是整个字符串。

我还试图制作span_term/payer\\/payer的最后</payer,但它根本找不到任何内容。

1 个答案:

答案 0 :(得分:1)

您可以添加span_not查询:

  

删除与另一个span查询重叠的匹配项。 span不查询映射到Lucene SpanNotQuery