弹性搜索 - 具有数组类型和嵌套对象属性的复杂查询

时间:2013-01-30 07:26:34

标签: indexing elasticsearch

鉴于以下映射,我需要获得符合以下条件的结果

  1. 与名字,姓氏,date_of_birth和Active = true OR
  2. 完全匹配
  3. 与名字,姓氏,Active = true和1封电子邮件中的可能匹配的完全匹配OR
  4. 姓名,姓氏,Active = true和1个traveldocument 数字与可能的倍数完全匹配
  5. 电子邮件和旅行证件可以引用一系列物品。

        {
        "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吗?

1 个答案:

答案 0 :(得分:7)

是的,你可以。

首先,回答有关嵌套查询的问题:

如果您需要在对象集合中查询SAME OBJECT中的多个字段(例如travel_document.nationalitytravel_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