我正在从事Elasticsearch并在搜索查询中使用术语。请在下面查看样本索引数据:
"_source": {
"type": "ITEM",
"primaryKey": "3923",
"displayName": "Lumia 505",
"attributes": {
"n26273": "Lumia 505",
"n26275": "Mobile"
},
"mappings": {
"Primary Hierarchy": [
"Nokia"
]
}
}
我要使用下面的查询来针对我的任何搜索文本搜索数据,
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"----MySearchTextHere----",
"default_operator":"AND"
}
},
{
"term":{
"type":"item"
}
}
]
}
},
"size":10,
"from":0
}
查询:
1.如何在查询中添加术语以搜索作为数组的字段“ mappings.Primary Hierarchy” ?
2.如何在不提及嵌套字段名称的情况下实现#1,因为嵌套字段名称是动态的?只有字段名称 mappings 是常量。
答案 0 :(得分:0)
在术语查询中引用嵌套字段(在您的情况下为"mappings.Primary Hierarchy"
)没有问题
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"Nokia",
"default_operator":"AND"
}
},
{
"term":{
"mappings.Primary Hierarchy":"nokia"
}
}
]
}
},
"size":10,
"from":0
}
这只会被诺基亚成功过滤。如果要完全使用诺基亚(而非术语),则应使用"mappings.Primary Hierarchy.keyword"
字段。 Keyword的意思是,该字段的内容与索引期间您传递的内容完全相同。
第二件事也是可能的,但需要适当的映射。您需要指定映射为nested type(这意味着其中可能还有其他字段)。
您的情况下的一个简单示例可能是这样的:
{
"mappings": {
"_doc" : {
"properties" : {
"mappings" : {
"type" : "nested"
}
}
}
}
}
您需要应用这些设置来创建索引。
在这种情况下,您的查询可能如下所示:
{
"query": {
"nested": {
"path": "mappings",
"query": {
"multi_match": {
"query": "Nokia"
}
}
}
}
}
Multi match query(未指定任何字段)将默认为映射对象
下的所有字段