【问题标题】:ElasticSearch simple queryElasticSearch 简单查询
【发布时间】:2020-06-04 06:04:14
【问题描述】:

我的 ElasticSearch 中有这样的结构

{
        _index: 'index',
        _type: 'product',
        _id: '896',
        _score: 0,
        _source: {
          entity_id: '896',
          category: [
            {
              category_id: 2,
              is_virtual: 'false'
            },
            {
              category_id: 82,
              is_virtual: 'false'
            }
          ]
        }
      }

我想返回所有具有“82”category_id 的“产品”。

{
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "category.category_id": [
            82
          ]
        }
      }
    }
  }
}

这个查询给了我 0 次点击。

这样做的正确方法是什么?

【问题讨论】:

    标签: elasticsearch elasticsearch-query elasticsearch-nested


    【解决方案1】:

    添加工作示例,您需要将category 定义为嵌套字段并通过包含nested 路径来修改您的搜索查询

    索引映射

    {
        "mappings": {
            "properties": {
                "entity_id": {
                    "type": "text"
                },
                "category": {
                    "type": "nested"
                }
            }
        }
    }
    

    索引您的文档

    {
        "entity_id": "896",
        "category": [
            {
                "category_id": 2,
                "is_virtual": false
            },
            {
                "category_id": 82,
                "is_virtual": false
            }
        ]
    }
    

    正确的搜索查询,注意我们使用的是不支持普通过滤器的嵌套查询(因此您的查询会出错)

    {
        "query": {
            "nested": {
                "path": "category",
                "query": {
                    "bool": {
                        "must": [
                            {
                                "match": {
                                    "category.category_id": 82
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
    

    搜索结果返回索引文档

     "hits": [
                {
                    "_index": "complexnested",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 1.0,
                    "_source": {
                        "entity_id": "896",
                        "category": [
                            {
                                "category_id": 2,
                                "is_virtual": false
                            },
                            {
                                "category_id": 82,
                                "is_virtual": false
                            }
                        ]
                    }
                }
            ]
    

    【讨论】:

    • 鉴于他的查询没有返回任何内容,这可能意味着category 已经嵌套,但他没有使用嵌套查询。所以我的结论是他的映射是正确的,但他的查询不是
    • 好吧,你的意思是如果类别没有嵌套,那么他的查询会返回结果?
    • 是的,它会返回一些东西,因为它是对一个简单的object 字段的查询
    • @Val,是的,但他没有提供他的映射,所以我想提一下,但明白了你的意思。
    • 是的,没关系,别担心,+1 给你 ;-)
    【解决方案2】:

    如果您的查询没有结果,我怀疑category 在您的索引映射中属于type nested。如果是这种情况,那很好,您可以像这样修改查询以使用nested query

    {
      "query": {
        "bool": {
          "filter": {
            "nested": {
              "path": "category",
              "query": {
                "terms": {
                  "category.category_id": [
                    82
                  ]
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2021-05-24
      • 2020-04-27
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多