鉴于以下映射,我需要获得符合以下条件的结果
电子邮件和旅行证件可以引用一系列物品。
{
"profile":{
"properties":{
"date_of_birth":{
"type":"date",
"store":"no"
},
"first_name":{
"type":"string",
"store":"no"
},
"last_name":{
"type":"string",
"store":"no"
},
"email":{
"type":"string",
"store":"no"
},
"active":{
"type":"string",
"store":"no"
},
"travel_document":{
"properties" : {
"countryOfCitizenship" : {"type" : "string"},
"countryOfIssue" : {"type" : "string"},
"expirationDate" : {"type" : "date"},
"nationality" : {"type" : "string"},
"number" : {"type" : "string"},
"addressLines" : {"type": "string"},
"issuedForAreaCode" : {"type": "string"},
"type" : {"type": "string"}
}
}
}
}
}
有没有办法可以在elasticsearch中执行这种搜索?我可以使用Nested Queries吗?
答案 0 :(得分:7)
是的,你可以。
首先,回答有关嵌套查询的问题:
如果您需要在对象集合中查询SAME OBJECT中的多个字段(例如travel_document.nationality
和travel_document.expirationDate
,则需要从类型{{1}更改travel_document
输入object
并使用嵌套查询。
在您提供的示例查询中,您尚未显示需要此功能。相反,您询问任何nested
是否有值。因此,在这种情况下,您不需要使用嵌套功能。
(如果您认为将来可能需要对相关字段进行查询,那么您可能确实希望使用travel_document
。您还可以设置nested
以将嵌套对象编入索引include_in_root
个对象和主文档中。)
对于下面的查询,我假设nested
未嵌套。
第二:你使用"完全匹配"在名称字段中。
默认情况下,会对字符串字段进行分析,因此" Mary Jane"将被编入索引[' mary' jane']。如果你在该字段上运行查询" Mary",那么它将匹配,因为该字段确实包含" mary"。但是,这不完全匹配。
如果你想进行精确匹配,那么你需要创建字段travel_document
,在这种情况下" Mary Jane"将被索引为单个术语" Mary Jane",以及对#34; Mary"的查询。不匹配。缺点是在这种情况下你不能在名称字段上使用全文查询。
同样,将电子邮件字段not_analyzed(或使用带有not_analyzed
标记化程序的自定义分析器 - 它不会对字符串进行标记化 - 以及keyword
标记过滤器可能更有意义)。
在下面的查询中,我假设您的名称字段已分析,并且您的电子邮件字段未分析:
lowercase