开发者社区 问答 正文

Elasticsearch按数组中的出现或顺序搜索/过滤

我的索引中有一个* data *字段,

我只需要doc 2作为结果,即在逻辑上* b 在数组字段数据中的 a *之前。

doc 1:

data = ['a','b','t','k','p']

文件2:

data = ['p','b','i','o','a']

目前,我正在尝试在[a,b]上使用条款,然后在另一个代码段中检查顺序。请提出更好的建议。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 15:37:48 970 分享 版权
1 条回答
写回答
取消 提交回答
  • 我的理解是,唯一的方法就是利用跨度查询,但是它不适用于值数组。

    您需要将这些值连接到一个以space作为分隔符的text字段中,重新整理文档并在该字段上使用Span Near查询:

    请找到以下映射,示例文档,查询和响应:

    对应: PUT my_test_index { "mappings": { "properties": { "data":{ "type": "text" } } } } 样本文件: POST my_test_index/_doc/1 { "data": "a b" }

    POST my_test_index/_doc/2
    {
      "data": "b a"
    }
    

    跨度查询: POST my_test_index/_search { "query": { "span_near" : { "clauses" : [ { "span_term" : { "data" : "a" } }, { "span_term" : { "data" : "b" } } ], "slop" : 0, <--- This means only ` a b ` would return but ` a c b ` won't. "in_order" : true <--- This means a should come first and the b } } }

    请注意,* slop *控制所允许的最大中间不匹配位置数。

    响应: { "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.36464313, "hits" : [ { "_index" : "my_test_index", "_type" : "_doc", "_id" : "1", "_score" : 0.36464313, "_source" : { "data" : "a b" } } ] } }

    让我知道是否有帮助!

    回答来源:stackoverflow

    2020-03-24 15:37:58
    赞同 展开评论