2017-09-01 53 views
2

我有一个包含一个XML文件,我试图找到这种匹配的文本字段:elasticsearch span_near查询虚假点击

<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文档包含类似的东西:

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

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

任何想法,我可以防止这种“贪婪”的搜索?

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

我也试过最后span_term/payer\\/payer</payer但它什么都没发现。

+1

也许['span_not'](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-span-not-query.html)可以在这里帮助。顺便说一句,有一些Lucene正则表达式可以比PCRE更好地实现。例如。您可以使用'〜()bic = \“123456789 \”〜('来匹配整个字符串,这些字符串与您提供的不需要的字符串不匹配。 –

+0

这里有什么问题?你只想找到与付款人完全子字符串? – Mysterion

+0

Mysterion,yess – SergeiK

回答

1

您可以添加一个span_not查询:

删除其与另一跨度查询重叠匹配。跨度不查询映射到Lucene SpanNotQuery