在以下情况下如何查询索引。
文档具有以下属性:
body: # text
shares: # array of share(s)
share:
orgid: # text
role: # text
以下是一些示例文档:
docs = [
{'body':'hello', 'shares':[{'orgid':'abc.de.1', 'role':'11'},
{'orgid':'abc', 'role':'1'}]},
{'body':'world', 'shares':[{'orgid':'abc.de', 'role':'111'}]},
{'body':'today', 'shares':[{'orgid':'abc', 'role':'111'}]}
]
使用 ElasticSearch 语法,我想做以下查询:
Give me all docs where prefix of 'shares.orgid' = 'abc' and prefix of shares.role = '11'
Should return: all of them
Give me all docs where prefix of 'shares.orgid' = 'abc.de' and prefix of shares.role = '111'
Should return: world
Give me all docs where prefix of 'shares.orgid' = 'abc.de.1' and prefix of shares.role = '11'
Should return: nothing
Give me all docs where prefix of 'shares.orgid' = 'abc' and prefix of shares.role = '111'
Should return: world, today
当我研究这个时,我发现了以下感兴趣的信息:
特别是: 弹性搜索
ElasticSearch 允许您使用两种类型的查询 - has_children 和 top_children 查询来对子文档进行操作。第一个查询接受以 ElasticSearch Query DSL 表示的查询以及子类型,它会导致所有父文档具有与给定查询匹配的子文档。第二种类型的查询针对一组子文档运行,然后将它们聚合到父文档中。我们还可以为第二种查询类型选择分数计算。
也很有趣:http ://www.elasticsearch.org/guide/reference/query-dsl/has-child-query.html
更多重新索引:http ://www.elasticsearch.org/guide/reference/api/index_.html 父母和孩子
子文档可以通过在索引时指定它的父文档来索引。例如:
$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{
"tag" : "something"
}'
索引子文档时,路由值会自动设置为与其父文档相同,除非使用 routing 参数显式指定路由值。
编辑:
我越来越近了。这是一个使用我正在尝试的包装器的测试,它演示了一种方法。我将编写一个测试来演示问题/问题的解决方案。https://github.com/aparo/pyes/blob/master/tests/test_nested.py。我运行了该测试并对其进行了调整以使用 PrefixQuery 并且它可以工作。
根据评论者 javanna,子查询不是前进的方向。以下是使用 pyes 的示例摘录:
from pyes.filters import TermFilter, NestedFilter
from pyes.query import FilteredQuery, MatchAllQuery, BoolQuery, TermQuery, PrefixQuery
# from their unit test setup
self.conn.index({"field1": "value1",
"nested1": [{"n_field1": "n_value1_1",
"n_field2": "n_value2_1"},
{"n_field1": "n_value1_2",
"n_field2": "n_value2_2"}]},
self.index_name, self.document_type, 1)
self.conn.index({"field1": "value1",
"nested1": [{"n_field1": "n_value1_1",
"n_field2": "n_value2_2"},
{"n_field1": "n_value1_2",
"n_field2": "n_value2_1"}]},
self.index_name, self.document_type, 2)
self.conn.index({"field1": "value1",
"nested1": [{"n_field1": "ni",
"n_field2": "11"},
{"n_field1": "n_value1_2",
"n_field2": "n_value2_1"}]},
self.index_name, self.document_type, 3)
self.conn.index({"field1": "value1",
"nested1": [{"n_field1": "ni.kirmse.104",
"n_field2": "111"},
{"n_field1": "n_value1_2",
"n_field2": "n_value2_1"}]},
self.index_name, self.document_type, 4)
self.conn.refresh(self.index_name)
# just hacked their test to quickly see if I could do a prefix query on beginning of nested array/list values.
q = FilteredQuery(MatchAllQuery(),
NestedFilter('nested1',
BoolQuery(must=[PrefixQuery('nested1.n_field1', 'ni'),
PrefixQuery('nested1.n_field2', '111')])))
resultset = self.conn.search(query=q, indices=self.index_name, doc_types=[self.document_type])