我的文件看起来像这样:
{"foo" : "blah blah blah",
"bar" : "bla bla bla",
"baz" : [{"href" : "someid"}, {"href" : "otherid"}, ...],
... }
我想进行搜索,找到其中一个id
子文档中出现href
的所有文档。如果我在映射中将baz.href
设置为未分析,我可以使用术语查询来搜索baz.href
。
但是,我真正想要的是能够搜索此ID,无论它出现在何处。它可能位于baz.href
,quux.href
或whatever.href
。在_all
中搜索是完全可以接受的。
然而,我无法做到这一点。我从来没有得到任何结果,除非我正好搜索baz.href
。
我尝试在映射中include_in_all
上设置baz
,但无济于事。我尝试在baz.href
上设置它,但这也不起作用。
我知道我可以在顶层的单独all_hrefs
字段中复制ID,但这会不必要地炸毁文档,而且看起来很难看。参考列表可能非常大。我还可以解析自己的映射并在那里找到所有href
,以便我可以在查询中明确列出所有href
字段,但随着数据模型的增长,最终不再按比例缩放
帮助?
更新:datasets
字段(以及包含href
的所有其他字段的映射如下所示):
"datasets" : {
"properties" : {
"href" : {
"include_in_all" : true,
"index" : "not_analyzed",
"type" : "string"
}
},
"type" : "nested"
},
我尝试删除nested
并放弃include_in_all
,但这没有任何区别。当我nested
时,我可以使用嵌套查询,但path
必须设置为datasets
,因为*
失败,因为并非所有字段都包含嵌套对象。
答案 0 :(得分:0)
使用提供的映射:
JSONArray jArray = new JSONArray();
for (int i = 0; i < docList.size(); i++) {
JSONObject json = new JSONObject(hoi2.get(i));
jArray.put(json);
}
当我索引这些文件时:
$ curl -XPOST 'localhost:9200/datasets/data?pretty=true' -d '
{
"datasets" : {
"properties" : {
"href" : {
"include_in_all" : false,
"index" : "not_analyzed",
"type" : "string"
}
},
"type" : "nested"
}
}'
我能够通过以下方式正确搜索href字段:
$ curl -XPOST 'localhost:9200/datasets/data' -d '
{
"foo": "blah blah blah",
"bar": "bla bla bla",
"baz": [
{
"href": "someid"
},
{
"href": "otherid"
}
],
"quux": {
"href": "thisid"
},
"whatever": {
"href": "thatid"
}
}'
$ curl -XPOST 'localhost:9200/datasets/data' -d '
{
"foo": "argh argh argh",
"bar": "arg arg arg",
"baz": [
{
"href": "funkyid"
},
{
"href": "thisid"
}
],
"quux": {
"href": "hipsterid"
},
"whatever": {
"href": "coolid"
}
}'
因此,无需在$ curl -XPOST 'localhost:9200/datasets/data/_search?pretty=true' -d '{
"query": {
"query_string": {
"query": "thisid",
"fields": ["*.href"]
}
}
}'
字段中对其进行索引。
我的测试是在Elasticsearch 5.2.1上完成的。
仅供参考,这是我找到问题解决方案的地方: Searching term in subdocuments with elasticsearch