弹性搜索5,按子列表从列表中搜索

时间:2018-01-27 10:14:32

标签: list nest elasticsearch-5

我试图从具有list属性的对象进行搜索。 我需要能够选择包含所有子列表项的所有对象。

ex: 如果我的对象有[A,B,C],则应该为给定的查询返回它: [A],[A,B],[A,B,C],[A,C],[C,A] ......(输入顺序不必匹配)

但如果子列表包含任何不属于对象列表的元素,则不应返回该元素。

ex: [D],[A,D] ...... 这些查询不应该有效。

我已经设法为现有子列表的查询执行此操作,但是当子列表中的任何项目不存在时都没有。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

使用逗号分隔子列表查询项作为匹配查询的值,并将运算符值设置为“和”,如下所示:

文件样本:

{
  "Id": 1,
  "Name": "One",
  "tags": ["A","B","C"]
}

对于子列表:[A,B]:

{
  "query": {
    "match": {
      "tags": {
        "query": "A,B",
        "operator": "and"
      }
    }
  }
}

我在ElasticSearch 5.6.0和6.1.2中测试

答案 1 :(得分:0)

假设ABC等被映射为keyword types,多个bool查询filter条款将是单向< / p>

var response = client.Search<User>(s => s
    .Query(q => +q
        .Term(f => f.Badges, "A") && +q
        .Term(f => f.Badges, "B") && +q
        .Term(f => f.Badges, "C")
    )
);

生成以下查询

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "badges": {
              "value": "A"
            }
          }
        },
        {
          "term": {
            "badges": {
              "value": "B"
            }
          }
        },
        {
          "term": {
            "badges": {
              "value": "C"
            }
          }
        }
      ]
    }
  }
}

用户文档需要至少所有ABC徽章才能被视为匹配。

除了ABC之外,用户文档还可能包含其他徽章;如果您需要查找完全 ABC的文档,请使用{{1}查看terms_set query } value设置为传递的术语数。