在文本字段上进行完全匹配搜索

时间:2019-05-24 09:34:00

标签: elasticsearch

我正在使用ElasticSearch搜索数据。我的数据包含文本字段,当我尝试匹配输入的查询时,它将输出带有另一个字符串的输入。

_mapping

"direction": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}

弹性数据

[
  {
   direction: "North"
  },
  {
   direction: "North East"
  }
]

查询

{
  match: {
    "direction" : {
      query: "North",
      operator : "and"
    }
  }
}

结果

[
  {
   direction: "North"
  },
  {
   direction: "North East"
  }
]

预期结果

[
  {
   direction: "North"
  }
]
  

注意:它应该输出完全匹配的方向

3 个答案:

答案 0 :(得分:1)

您可能要查看Term Queries数据类型上使用的keyword,以执行精确匹配搜索。

POST <your_index_name>/_search
{
    "query": {
        "term": {
            "direction.keyword": {
                "value": "North"
            }
        }
    }
}

观察到的结果是因为您正在使用TextMatch Query字段中进行查询。文本字段的值分解为令牌,然后将其存储在反向索引中。此过程称为Analysis文本字段不用于完全匹配。

还要注意,无论您在Match Query中提到的单词/标记,在执行之前,它们都将经历分析阶段。

希望有帮助!

答案 1 :(得分:1)

根据您的映射,如果要完全匹配,则不应在字段direction上搜索,而应在direction.keyword上搜索。字段direction的类型为text并被分析-在您的情况下为单词northeast

答案 2 :(得分:0)

尝试一下 {“ query”:{“ bool”:{“ must”:{“ term”:{“ direction”:“ North”}}}}}