【问题标题】:How to search in a list of results on elasticsearch如何在elasticsearch的结果列表中搜索
【发布时间】:2022-01-05 09:49:29
【问题描述】:

如何在索引数组之类的列表中搜索,我是 Elasticsearch 的新手,请告诉我一些概念的名称是什么。我不知道哪个概念是正确的,例如:在我的问题中是说数组、对象、属性还是列表更好?

这是我在 Kibana 中运行 GET car/_doc/4 时的结果

{
    "_index" : "car",
    "_type" : "_doc",
    "_id" : "4",
    "_version" : 2,
    "_seq_no" : 7,
    "_primary_term" : 1,
    "found" : true,
    "_source" : {
      "id" : 4,
      "user_id" : 7,
      "ads" : {
        "0" : {
          "id" : 1,
          "priority" : 1,
          "city_id" : 83,
          "model_id" : 13
        },
        "2" : {
            "id" : 4,
            "priority" : 2,
            "city_id" : 54,
            "model_id" : 23
        }  
      },
      "status" : 1
    }
  }

这是我对GET car/_doc/15 的结果

{
    "_index" : "car",
    "_type" : "_doc",
    "_id" : "15",
    "_version" : 2,
    "_seq_no" : 27,
    "_primary_term" : 1,
    "found" : true,
    "_source" : {
      "id" : 15,
      "user_id" : 24,
      "ads" : [
        {
          "id" : 5,
          "priority" : 4,
          "city_id" : 42,
          "model_id" : 11
        }
      ],
      "status" : 1
    }
  }
  

如您所见,我有两种类型的广告。我的问题是如何搜索When status is 1 和 (ads.city_id = 83 OR ads.0.city_id = 83)

我可以使用:

GET car/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "ads.city.slug": ["LA"]
          }
        }
      ]
    }
  }
}

但它不适用于其他类型的广告,我需要使用这样的东西:

GET car/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "ads.2.city.slug": ["NewYork"]
          }
        }
      ]
    }
  }
}

如何在不编写广告索引的情况下编写查询 (2)?

【问题讨论】:

  • 数据的规范化在 Elasticsearch 中很重要。我会建议您在索引到弹性搜索之前规范化您的数据。请确保两个广告在 elasticsearch 中具有相同类型的数据,因此您应该只使用一种类型的查询。此外,这里 elasticsearch 将“0”或“2”视为关键字,而不是广告索引。第一个是数组类型,第二个例子是对象类型。
  • @SagarPatel 您的评论就是我的回答。没错。

标签: elasticsearch kibana


【解决方案1】:

正如 SagarPatel 在评论中建议的那样,将 ads 字段规范化为对象数组(就像在您的示例中使用 id: 15 的文档一样)。之后使用定义的静态映射创建一个索引,如下所示:

PUT /your-index-name
{
  "mappings": {
    "properties": {
      "ads": {
        "type": "nested" 
      }
    }
  }
}

(顺便说一句,最好也为其他字段定义静态映射)

嵌套类型会将ads 对象作为单独的内部文档进行索引。见elastic docs

将文档添加到创建的索引后,您可以按如下方式运行查询:

GET /your-index-name/_search
"query": {
    "bool": {
        "must": [
            {
                "nested": {
                    "path": "ads",
                    "query": {
                        "term": {
                            "ads.city_id": {
                                "value": 83
                            }
                        }
                    }
                }
            },
            {
                "nested": {
                    "path": "ads",
                    "query": {
                        "term": {
                            "ads.city_id": {
                                "value": 94
                            }
                        }
                    }
                }
            }
        ],
        "minimum_should_match" : 1 // OR clause
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多