Database 基于数组中的和条件过滤ElasticSearch结果
以下是我的索引中单个记录的数据示例:Database 基于数组中的和条件过滤ElasticSearch结果,database,
elasticsearch,elastic-stack,Database,
elasticsearch,Elastic Stack,以下是我的索引中单个记录的数据示例: { "_index" : "test_index", "_type" : "_doc", "_id" : "49605102905391763685971719283371021096086998966740189186", "_score" : 2.885
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "49605102905391763685971719283371021096086998966740189186",
"_score" : 2.8858113,
"_source" : {
"properties" : {
"activity" : [
{
"activityId" : 39,
"actionVersion" : 2,
"actionIdx" : 3
},
{
"activityId" : 39,
"actionVersion" : 2,
"actionIdx" : 4
},
{
"activityId" : 39,
"actionVersion" : 2,
"actionIdx" : 5
},
{
"activityId" : 42,
"actionVersion" : 2,
"actionIdx" : 3
},
{
"activityId" : 42,
"actionVersion" : 2,
"actionIdx" : 4
},
{
"activityId" : 42,
"actionVersion" : 2,
"actionIdx" : 5
}
]
}
}
}
我想根据ActivityID 42和actionIdx 3筛选结果。我正在使用下面的查询来获取结果
{"size":-1,
"query": {
"bool": {
"should": {
"bool": {
"must": [
{
"match": {
"activityId": 42
}
},
{
"match": {
"actionIdx": 3
}
}
]
}
}
}
}
}
我正在获取包含ActivityID42和ActionIDX3的记录,但我的要求是在同一个对象中包含Activity42和ActionIDX3的记录。以下是我的上述搜索查询结果:
"activity" : [
{
"activityId" : 39,
"actionVersion" : 2,
"actionIdx" : 2
},
{
"activityId" : 28,
"actionVersion" : 2,
"actionIdx" : 3
},
{
"activityId" : 42,
"actionVersion" : 2,
"actionIdx" : 2
},
{
"activityId" : 41,
"actionVersion" : 2,
"actionIdx" : 3
}
]
我的预期产出是:
"activity" : [
{
"activityId" : 39,
"actionVersion" : 2,
"actionIdx" : 2
},
{
"activityId" : 28,
"actionVersion" : 2,
"actionIdx" : 3
},
{
"activityId" : 42,
"actionVersion" : 2,
"actionIdx" : 3
}
]
这是映射索引。活动不是嵌套的
"properties" : {
"properties" : {
"activity" : {
"properties" : {
"actionIdx" : {
"type" : "long"
},
"actionVersion" : {
"type" : "long"
},
"activityId" : {
"type" : "long"
}
}
}
}
}
您需要使用和查询来实现这一点,因为您现在没有使用它,它被认为是对象数据类型(默认)和嵌套文档清楚地提到了您所面临的问题
当使用一组大的任意键摄取键值对时,
可以考虑将每个键值对建模为自己的嵌套。
包含键和值字段的文档。相反,考虑使用
展平数据类型,将整个对象映射为单个字段和
允许对其内容进行简单搜索。嵌套文档和
查询通常比较昂贵,因此使用展平数据类型
这个用例是一个更好的选择
索引映射
{
"mappings": {
"properties": {
"properties": {
"properties": {
"activity": {
"type": "nested"
}
}
}
}
}
}
索引数据:
{
"properties": {
"activity": [
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 3
},
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 4
},
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 5
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 3
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 4
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 5
}
]
}
}
{
"query": {
"nested": {
"path": "properties.activity",
"query": {
"bool": {
"must": [
{
"match": {
"properties.activity.activityId": 42
}
},
{
"match": {
"properties.activity.actionIdx": 3
}
}
]
}
},
"inner_hits":{}
}
}
}
搜索查询:
{
"properties": {
"activity": [
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 3
},
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 4
},
{
"activityId": 39,
"actionVersion": 2,
"actionIdx": 5
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 3
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 4
},
{
"activityId": 42,
"actionVersion": 2,
"actionIdx": 5
}
]
}
}
{
"query": {
"nested": {
"path": "properties.activity",
"query": {
"bool": {
"must": [
{
"match": {
"properties.activity.activityId": 42
}
},
{
"match": {
"properties.activity.actionIdx": 3
}
}
]
}
},
"inner_hits":{}
}
}
}
搜索结果
"hits": [
{
"_index": "fd_cb1",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "properties.activity",
"offset": 3
},
"_score": 2.0,
"_source": {
"activityId": 42,
"actionVersion": 2,
"actionIdx": 3
}
}
]
你能提供你的索引映射吗?我正在处理您的搜索查询,并将提供一个工作示例Hi@OpsterElasticsearchNinja,我尝试使用嵌套类型对象创建新索引,但仍然面临无法获得结果的问题。我给出了嵌套类型的完整示例,您尝试过吗?嗨,我尝试过该查询,但仍然无法工作。此外,活动的映射不是嵌套的。