match vs term

这个问题来自stackoverflow

https://stackoverflow.com/questions/23150670/elasticsearch-match-vs-term-query

首先还原一下这个场景

创建索引test,含有一个_doc类型

PUT /test
{
"mappings" : {
"_doc" : {
"properties" : {
"field1" : {
"type" : "text",
"analyzer" : "standard"
}
}
}
}
}

索引一个_doc类型的文档到test

POST /test/_doc
{
"field1": "GET"
}

通过match查找GET,可以找到结果

GET /test/_doc/_search
{
"query": {
"bool": {
"must": [
{"match": {"field1": "GET"}}
]
}
}
}

通过term查找GET,找不到结果

GET /test/_doc/_search
{
"query": {
"bool": {
"must": [
{"term": {"field1": "GET"}}
]
}
}
}

Question

使用match查询request.method:GET

{
"query": {
"filtered": {
"query": {
"match": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...

match查询可以拿到结果,但问题是当使用term来进行查询时没有任何结果

{
"query": {
"filtered": {
"query": {
"term": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...

ANSWER

可能使用了Standard Analyzer,在对文档进行索引的时候GET变成了get,而文档的_source依然是GET

GET /_analyze
{
"analyzer": "standard",
"text": "GET"
} # response
# 可以看到token是get
{
"tokens": [
{
"token": "get",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
}
]
}

match查询将会对搜索的句子应用Standard Analyzer,即搜索中的GET会变成get,那么就会命中文档。而term查询并不会对搜索的内容进行分析,因此会直接查找get,那么就找不到该文档。

如果想要term查询可以生效,那么可以:

  • 将搜索中的GET变为小写的get
  • 修改request.method字段的类型为not_analyzed
  • 修改request.method字段的类型为keyword

官方文档的一些说明

ElasticSearch官方文档对matchterm的说明

match 接受文本/数字/日期,并分析它们

term 根据提供的确切值查找文本


ElasticSearch - match vs term的更多相关文章

  1. ElasticSearch match, match_phrase, term区别

    1.term结构化字段查询,匹配一个值,且输入的值不会被分词器分词. 比如查询条件是: { "query":{ "term":{ "foo" ...

  2. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  3. (转载)elasticsearch 查询(match和term)

    原文地址:https://www.cnblogs.com/yjf512/p/4897294.html elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版 ...

  4. ES 入门记录之 match和term查询的区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  5. Elasticsearch中的Term查询和全文查询

    目录 前言 Term 查询 exists 查询 fuzzy 查询 ids 查询 prefix 查询 range 查询 regexp 查询 term 查询 terms 查询 terms_set 查询 t ...

  6. (转)Elasticsearch查询规则------match和term

    es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询 ...

  7. Elasticsearch查询规则(一)match和term

    es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询 ...

  8. ES 20 - 查询Elasticsearch中的数据 (基于DSL查询, 包括查询校验match + bool + term)

    目录 1 什么是DSL 2 DSL校验 - 定位不合法的查询语句 3 match query的使用 3.1 简单功能示例 3.1.1 查询所有文档 3.1.2 查询满足一定条件的文档 3.1.3 分页 ...

  9. 在Elasticsearch中查询Term Vectors词条向量信息

    这篇文章有点深度,可能需要一些Lucene或者全文检索的背景.由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正. 更多内容还请参考整理的ELK教程 关于Term Vectors 额, ...

随机推荐

  1. scala基本语法和单词统计

    scala 基本语法 1.声明变量 (1)val i = 1 使用val声明的变量值是不可变的,相当于java里final修饰的变量,推荐使用. (2)var i = "hello" ...

  2. js event 冒泡和捕获事件详细介绍【转】

    冒泡和捕获 冒泡: 事件从内向外,从下向上执行 (默认行为) 捕获: 事件从外向内,从上向下执行 vue之capture 捕获事件 capture.html <!DOCTYPE html> ...

  3. SQL Server进阶(一)T-SQL查询和编程的背景

  4. EventKey为last_trade_no的subscribe关注事件

    如果用户曾经在该公众号有支付行为,关注的时候EventKey中将包含上次交易订单号,如 last_trade_no_4002752001201704258347703919 <xml> & ...

  5. 基于json文件实现的gearman任务自动重启

    一:在gearman任务失败后,调用task_failed def task_failed(task, *args): info = '\n'.join(args) datetime = local_ ...

  6. 「About Blockchain(一)」达沃斯年会上的区块链

    「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...

  7. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  8. crontab在/var/log/目录下没有cron.log文件

    1.修改rsyslog文件: /etc/rsyslog.d/50-default.conf 将  rsyslog  文件中的  #cron.*  前的  #  删掉: 2.重启rsyslog服务: s ...

  9. ajax异步请求302

    我们知道,只有请求成功ajax才会进行回调处理,具体状态码为 status >= 200 && status < 300 || status === 304; 这一点通过查 ...

  10. windows系统下安装tomcat及配置

    1.安装测试 1.安装 推荐使用免安装版的Tomcat(放在没有中文和空格的目录下),前提是已经安装了JDK并配置了环境变量. 2.测试 双击startup.bat,浏览器输入url:localhos ...