【发布时间】: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