这是我之前提出的search stops after the first match
问题我在这里给你一个映射。
{
"copy_order_snapshot": {
"properties": {
"line_item_info": {
"dynamic": "true",
"properties": {
"m_product_details": {
"dynamic": "true",
"properties": {
"accessories_colour": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"other_details": {
"dynamic": "true",
"properties": {
"accessories_material_type": {
"type": "string"
}
"status": {
"type": "string"
}
}
},
"product_details": {
"dynamic": "true",
"properties": {
"accessories_colour": {
"type": "string"
},
"status": {
"type": "string"
}
}
}
}
},
"order_data": {
"dynamic": "true",
"properties": {
"state": {
"type": "string"
},
"status": {
"type": "string"
}
}
}
}
}
}
在上一个问题中,我在谈论attribute_set_id
,这里的情况与status
相同。 order_details->status is "enabled"
而其他状态为"1" and "canceled"
。当我搜索
{
"query":{
"term":{
"status":"enabled"
}
}
}
我得到了结果
但如果我搜索
{
"query":{
"term":{
"status":"1"
}
}
}
或
{
"query":{
"term":{
"status":"canceled"
}
}
}
我没有结果。
请帮忙。
答案 0 :(得分:1)
这是因为模糊的字段名称“status”。在查询处理期间,elasticsearch将字段名称“status”解析为它匹配的第一个完全限定的字段名称。当我在我的机器上运行它时,它被解析为line_item_info.other_details.status。
$ curl "localhost:9200/test-orders/_validate/query?q=status:blah&explain=true&pretty=true"
{
"valid" : true,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"explanations" : [ {
"index" : "test-orders",
"valid" : true,
"explanation" : "line_item_info.other_details.status:blah"
} ]
}
如果您希望查询与所有状态字段匹配,则可能需要使用完全限定名称(例如line_item_info.other_details.status
,line_item_info.m_product_details.status
等)并使用Dis Max或Bool Queries
例如:
$ curl -XGET http://localhost:9200/test-orders/copy_order_snapshot/_search -d '{
"query":{
"bool" : {
"should" : [
{
"term" : { "line_item_info.m_product_details.status" : "1" }
},
{
"term" : { "line_item_info.other_details.status" : "enabled" }
}
]
}
}
}'