【问题标题】:Elastic search 5, search from list by sublist弹性搜索5,逐个列表搜索
【发布时间】:2018-01-27 10:14:32
【问题描述】:

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

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

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

例如: [爸爸] ... 这些查询应该是无效的。

我已经设法使用现有子列表进行查询,但当子列表中的任何项目不存在时却没有。

有什么想法吗?

谢谢!

【问题讨论】:

  • 包含[A,B,C]的字段是如何映射的?

标签: list nest elasticsearch-5


【解决方案1】:

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

文件样本:

{
  "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 中测试

【讨论】:

  • 我刚试了一下,不行(弹性搜索6)
  • 请添加文档样本并尝试查询问题以进行检查
  • 这是一个示例文档"_index": "test_index", "_type": "mapping", "_id": "1", "_score": 0.2876821, "_source": { "id": 1, "tags": [ "A","C","B"] }我已经尝试过您的查询示例,它与“A”一起工作正常,但是一旦我添加其他用逗号分隔的字符,它就不起作用了
  • 我已经成功编写了查询{ "query": { "bool": { "must": [ { "match": {"tags": "B"}}, { "match": {"tags": "E"}}, { "match": {"tags": "A"}} ] } } } 谢谢
  • @tibere,我在 elasticsearch 6.1.2 中测试我的答案,这是可行的
【解决方案2】:

假设ABC等被映射为keyword types,多个bool查询filter子句将是一种方式

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 的文档,请查看terms_set query 并将minimum_should_match* 值设置为传递的术语数。

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2018-10-26
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多