ElasticSearch查询可从Documents获得准确结果

时间:2019-02-20 01:49:19

标签: elasticsearch

我有一个索引(名称:“ 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查询中哪里做错了?

2 个答案:

答案 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。您还可以根据需要使用includeexcludefilter source

答案 1 :(得分:0)

如果您的字段不是键入关键字,则必须添加.keyword

类型

这是ES自动在“类型”:“文本”字段上生成的

GET index1/_search
{
 "query": {
   "bool": {
     "must": [
       {
         "bool": {
           "should": [
             {
               "nested": {
                 "path": "fields",
                 "query": {
                   "match_phrase": {
                     "fields.field.keyword: "A.B"
                   }
                 }
               }
             }
           ]
         }
       }
     ]
   }
 }
}```