在 Elasticsearch 中查询列表
Querying lists in Elasticsearch
我在 Elasticsearch 中有一组文档。每个文档都有一个 "categories" 字段,它是一个有序列表,从最一般到最具体,是该文档所属类别的名称。类别层次结构是一种分类法(每个类别只有一个父级)但类别名称重叠。从根开始的完整类别链是识别文档所属类别的唯一可靠方法。
例如,一个文档可能有一个类别字段:
["Science", "Biology", "Journal"]
另一个可能有:
["Science", "Astronomy", "Journal"]
问题:
1) 如何将文档聚合到其独特的类别中?我将 "categories" 字段映射为未分析,但是,一个简单的术语聚合仍然会将上述两个文档组合在 "Journal" 存储桶中。有没有办法按列表中的位置聚合,或仅聚合列表中特定位置的术语?
2) 给定一个由其路径标识的唯一类别,我如何过滤该类别中的文档?有没有办法根据列表中的位置进行过滤?
不,你不能。参见 multivalue fields
However, arrays are indexed—made searchable—as multivalue fields, which are unordered. At search time, you can’t refer to “the first element” or “the last element.” Rather, think of an array as a bag of values.
你可以做的是,使用嵌套对象,或者更简单,只需在一个字段中写下路径,然后对其进行索引分析和未分析。
{"categories":"Science Biology Journal"}
现在您可以使用一系列过滤器和查询对其进行搜索。例如:
- 术语(未分析):如果你想要确切的路径
- 字符串查询:如果你想要一个或多个类别
- ...
我在 Elasticsearch 中有一组文档。每个文档都有一个 "categories" 字段,它是一个有序列表,从最一般到最具体,是该文档所属类别的名称。类别层次结构是一种分类法(每个类别只有一个父级)但类别名称重叠。从根开始的完整类别链是识别文档所属类别的唯一可靠方法。
例如,一个文档可能有一个类别字段:
["Science", "Biology", "Journal"]
另一个可能有:
["Science", "Astronomy", "Journal"]
问题:
1) 如何将文档聚合到其独特的类别中?我将 "categories" 字段映射为未分析,但是,一个简单的术语聚合仍然会将上述两个文档组合在 "Journal" 存储桶中。有没有办法按列表中的位置聚合,或仅聚合列表中特定位置的术语?
2) 给定一个由其路径标识的唯一类别,我如何过滤该类别中的文档?有没有办法根据列表中的位置进行过滤?
不,你不能。参见 multivalue fields
However, arrays are indexed—made searchable—as multivalue fields, which are unordered. At search time, you can’t refer to “the first element” or “the last element.” Rather, think of an array as a bag of values.
你可以做的是,使用嵌套对象,或者更简单,只需在一个字段中写下路径,然后对其进行索引分析和未分析。
{"categories":"Science Biology Journal"}
现在您可以使用一系列过滤器和查询对其进行搜索。例如:
- 术语(未分析):如果你想要确切的路径
- 字符串查询:如果你想要一个或多个类别
- ...