我尝试根据对象的属性值构建搜索查询,该属性值位于嵌套数组中。
一切正常:
curl -s -XGET 'http://localhost:9200/products/product/_search?q=items.sku:ABC123'
这不起作用。为什么,我缺少什么?:
{
"_source" : "items",
"query": {
"term" : {
"items.sku" : "ABC123"
}
}
}
我要检索的项目如下所示:
{
"name" : "Example product"
"brand" : {
"id" : 123,
"name" : "Nike"
},
"items" : [
{
id: 234,
sku: "ABC123"
},
{
id: 456,
sku: "XYZ963"
}
]
}
答案 0 :(得分:3)
查询不起作用,因为它没有使用与q
运算符相同的运算符。
q
运算符是使用query_string
查询的“捷径”。您所做的事情的等效查询实际上如下:
{
"_source": "items",
"query": {
"query_string": {
"query": "items.sku:ABC123"
}
}
}
按预期输出文件:
"hits": {
"total": 1,
"max_score": 0.19178301,
"hits": [
{
"_index": "products",
"_type": "product",
"_id": "AU_VTrjXeQSEeO15aKQi",
"_score": 0.19178301,
"_source": {
"items": [
{
"id": 234,
"sku": "ABC123"
},
{
"id": 456,
"sku": "XYZ963"
}
]
}
}
]
}
区别在于term
查询搜索未分析的值(在您的示例中为ABC123),而query_string
选择分析或不分析值根据被查询的字段的映射。
我认为,在您的情况下,您的字段items.sku
的映射只是string
,这意味着默认情况下,您的字段已分析 {{1} } analyzer:您的值已被编入索引standard
,因为它已经小写(请参阅standard analyzer documentation)。
我建议您阅读ElasticSearch权威指南的分析部分(请参阅here),以便更好地理解这一点。