ElasticSearch如何查询同时包含PERSON和ORGANIZATION类型实体的文档
ElasticSearch查询同时包含PERSON和ORGANIZATION实体的文档
你遇到的问题根源在于ElasticSearch对嵌套对象数组的默认处理逻辑:它会把数组里的所有对象属性扁平化存储,所以你之前的bool must查询会被理解为“寻找某个实体的type同时等于PERSON和ORGANIZATION”,这显然不符合你的需求——你要的是文档里分别存在这两种类型的实体。
下面是两种可行的解决方案:
方案一:使用Nested类型映射(推荐)
这是官方推荐的处理嵌套对象数组的方式,能精准匹配数组中的不同元素。
首先需要确保你的索引中entities字段被定义为nested类型(而非默认的object类型)。如果还没设置,先创建或更新索引映射:
PUT /your_index_name/_mapping { "properties": { "entities": { "type": "nested", "properties": { "text": {"type": "text"}, "type": {"type": "keyword"} } } } }
之后使用nested查询来分别匹配两种类型的实体:
{ "bool": { "must": [ { "nested": { "path": "entities", "query": { "match": { "entities.type": "PERSON" } } } }, { "nested": { "path": "entities", "query": { "match": { "entities.type": "ORGANIZATION" } } } } ] } }
方案二:使用minimum_should_match(无需修改映射的临时方案)
如果无法修改现有索引的映射,可以用这种方式,但要注意entities.type最好设置为keyword类型(避免分词干扰):
{ "bool": { "must": [ { "bool": { "should": [ {"match": {"entities.type": "PERSON"}}, {"match": {"entities.type": "ORGANIZATION"}} ], "minimum_should_match": 2 } } ] } }
这个查询要求文档必须同时满足should里的两个条件,也就是同时包含PERSON和ORGANIZATION类型的实体。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

