我有一个索引(名称:“ index1”)指向ElasticSearch中的多个文档。
文档的格式(json)为-
{
"_index": "index1",
"_type": "someType",
"_id": "randomIDBlahBlah",
"_source": {
"version": "2018",
"fields": [
{
"field": "A.B",
"lineNumber": 1
},
{
"field": "C.D",
"lineNumber": 2
},
{
"field": "A.E",
"lineNumber": 3
}]
},
"fields": {
"created": [
"2017-01-19T20:11:07.977Z"
]
},
"sort": [
2324343
]
}
这里是映射-
{
"index1": {
"mappings": {
"mapping": {
"properties": {
"branch": {
"type": "text"
},
"created": {
"type": "date"
},
"fields": {
"type": "nested",
"properties": {
"field": {
"type": "text"
},
"lineNumber": {
"type": "integer"
}
}
}
}
}
}
}
}
类似地,该索引下有多个文档,格式相同,但字段数据不同。
现在,我正在尝试在特定字段(此处为A.B)上执行以下提到的Elastic Search,它为我提供了来自所有文档的所有结果,就像在搜索所有字段一样。
我只想查看该特定字段的结果,而不是全部结果。
这是我的ES查询-
POST index1/_search
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"nested": {
"path": "fields",
"query": {
"match_phrase": {
"fields.field": "A.B"
}
}
}
}
]
}
}
]
}
}
}
我在ES查询中哪里做错了?
答案 0 :(得分:1)
您使用过的查询将为您提供所需的结果。如果您不需要计分,可以这样写得更好:
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "fields",
"query": {
"match": {
"fields.field": "A.B"
}
},
"inner_hits": {
"size": 10
}
}
}
]
}
},
"_source": {
"excludes": [
"fields"
]
}
}
Inner hits是您要寻找的。如果存在匹配项,elastic将返回完整的嵌套对象。如果只需要匹配的嵌套对象,则必须使用inner_hits
。
更新:如果除了内部匹配项之外不需要其他任何字段,则可以设置"_source":false
。您还可以根据需要使用include
和exclude
至filter source
答案 1 :(得分:0)
如果您的字段不是键入关键字,则必须添加.keyword
类型这是ES自动在“类型”:“文本”字段上生成的
GET index1/_search
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"nested": {
"path": "fields",
"query": {
"match_phrase": {
"fields.field.keyword: "A.B"
}
}
}
}
]
}
}
]
}
}
}```