弹性精确匹配和子字符串匹配在一起

时间:2019-02-13 18:42:21

标签: elasticsearch elastic-stack

我知道Elastic会使用“关键字”类型来查找完全匹配的内容。例如:

"address":  { "type": "keyword"}

太酷了。完全匹配的作品!

但我想同时具有两者和“ 完全匹配”和“ 子字符串”。因此,我决定创建以下映射:

   "address":  { "type": "text" , "index": true }

问题 如果我使用“文本”类型,如何搜索完全匹配的字符串? (不是子字符串)。我已经尝试了几种方法,但是没有用:

GET testing_index/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "address" :  "washington"
                }
            }
        }
    }
}

GET testing_index/_search
{
  "query": {
    "match": {
      "address" : "washington"
    }
  }
}

我只需要通用映射:

  • 找到确切的字符串
  • 查找子字符串

我希望弹性能做到这一点。

1 个答案:

答案 0 :(得分:1)

默认情况下,文本字段使用default analyzer,它会删除大多数标点符号,将文本分解成单个单词,并将它们小写。例如,标准分析器会将字符串“ Quick Brown Fox!”转换为术语[{quickbrownfox]。可以想象,这使得很难针对文本字段编写完全匹配查询。对于您的用例,我建议使用以下两个选项之一:

  1. 存储为keyword,并使用wildcardfuzzy查询完成类似子字符串的匹配。众所周知,通配符查询(尤其是带有前导通配符的查询)速度较慢,因此请谨慎操作。
  2. 存储该字段两次:一次为keyword,另一次为text。明显的缺点是索引的大小膨胀。

有关更多背景信息,请参见“术语查询” Elasticsearch文档,尤其是“为什么术语查询不匹配我的文档?”一节:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html