ElasticSearch查询 第三篇:词条查询

ElasticSearch查询 第一篇:搜索API

ElasticSearch查询 第二篇:文档更新

ElasticSearch查询 第三篇:词条查询

ElasticSearch查询 第四篇:匹配查询(Match)

ElasticSearch查询 第五篇:布尔查询

字符串的完全匹配是指字符的大小写,字符的数量和位置都是相同的,词条(term)查询使用字符的完全匹配方式进行文本搜索,词条查询不会分析(analyze)查询字符串,给定的字段必须完全匹配词条查询中指定的字符串。由于词条查询的字符串是未经分析(analyzed)的词条,因此,词条查询经常用于结构化的数据,例如,数值,日期等,当用于文本搜索时,最好在索引映射中设置字符串字段不被索引,也就是说,设置index属性为not_analyzed,否则,只能对该字段进行单词条搜索,也可以使用多字段(fields)属性,定义一个不被分析的字段,原始字段用于全文搜索,而多字段用于词条搜索:

"properties":

    "title":{"type":"string","index":"analyzed""fields":{"title_exact":{"type":"string","index":"not_analyzed"} }

    },

一,词条查询和全文查询

词条(term)查询和全文(fulltext)查询最大的不同之处是:全文查询首先分析(Analyze)查询字符串,使用默认的分析器分解成一系列的分词,term1,term2,termN,然后从索引中搜索是否有文档包含这些分词中的一个或多个,如果执行的match查询,默认的操作符(operator)是,只要文档的字段值能够匹配任意一个词条,该文档就匹配查询条件;而词条查询是字符的完全匹配,只有当字段的字符完全匹配查询字符串时,ElasticSearch引擎才判定文档匹配查询条件:

词条查询:词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时,才匹配搜索。当在未被分析的字段中进行搜索时,和查询字符串完全匹配的文档会被返回;如果在已分析(Analyzed)的字段中进行搜索,词条必须是小写的单个词条,否则,匹配不到任何文档;

全文查询:ElasticSearch引擎会先分析(analyze)查询字符串,将其拆分成小写的分词,只要已分析的字段中包含词条的任意一个,或全部包含,就匹配查询条件,返回该文档;如果不包含任意一个分词,表示没有任何文档匹配查询条件。

While the full text queries will analyze the query string before executing, the term-level queries operate on the exact terms that are stored in the inverted index.

举个例子,创建索引,并索引文档:

 View Code

字段full_text 默认值被分析的(analyzed),字段exact_value显式设置不被分析,索引文档的结果是:在倒排索引中,字段full_text包含两个分词:quick和foxes,分词都是小写的;而exact_value由于未被分析,只是整个短语“Quick Foxes!”,只能进行完全匹配,在查询条件中,少一个字符或多一个字符,甚至大小写不同都不能匹配。

1,对未分析的字段进行词条查询

GET my_index/my_type/_search

{

  "query": {

    "term": {

      "exact_value":"Quick Foxes!"

    }

  }

}

对于"exact_value": "Quick Foxes!" ,文档匹配该查询条件,如果将查询条件修改为"exact_value": "Quick Foxes",或"exact_value": "Quick",那么文档值不匹配查询条件,不会返回任何文档。  

2,对已分析(analyzed)的字段进行词条查询

GET my_index/my_type/_search

{

  "query": {

    "term": {

      "full_text":"Quick Foxes!"

    }

  }

}

对于查询条件 "full_text": "Quick Foxes!",不会返回任何文档,词条查询不会分析"Quick Foxes!",对于已分析的字段中,只有小写的单个词条,这些分词都不会匹配含有多个分词的词条。修改查询条件,"full_text": "quick",由于文档中包含该分词,因此文档匹配查询条件。

3,对已分析的字段进行全文查询

GET my_index/my_type/_search

{

  "query": {

    "match": {

      "full_text":"Quick Foxes!"

    }

  }

}

对于全文查询条件 "full_text": "Quick Foxes!",ElasticSearch引擎首先分析查询字符串,将其拆分成两个小写的分词:quick 和 foxes,由于字段full_text中包含这两个分词,因此,文档匹配匹配(match)查询。

二,单词条查询

对于单个词条,对eventname字段进行查询,由于该字段是被索引和分析(analyzed)的,因此,分词之后,该字段只包含小写的分词。

如果词条查询写成"eventname":"Azure",那么将匹配不到任何文档,ElastiSearch引擎返回空的hits数组。

POST /_search -d

  "from":10,

  "size":5,

  "query":{ 

      "term":{ 

        "eventname":"azure"      }

  }

}

三,多词条(terms)查询

多词条(terms)查询的查询条件是一个词条数组,只要文档匹配任意一个词条,就匹配查询条件。

POST /_search -d

  "from":10,

  "size":5,

  "query":{ 

      "terms":{ 

        "eventname":["azure","aws"]

      }

  }

}

四,范围查询

范围查询,是指查询字段值匹配一定的范围的文档:

{

    "range" : {

        "age" : {

            "gte":10,

            "lte":20,

            "boost":2.0        }

    }

}

范围查询使用的比较操作符:

gte:大于或等于(Greater-than or equal to)

gt:大于(Greater-than)

lte:小于或等于(Less-than or equal to)

lt:小于(Less-than)

五,前缀匹配查询

前缀匹配查询是指,文档的字段包含以指定的字符(不会被分析)为前缀的分词,前缀匹配适用于已分析字段,只能匹配单个分词的前缀;也适用于未被分析的字段,这样,字符串将从原始值的第一个字符开始前缀匹配,例如:"exact_value": "Qui" 

{

  "query": {

    "prefix": {

      "full_text":"qu"

    }

  }

}

六,通配符匹配查询

ElsticSearch支持的通配符(wildcard)有2个,分别是:

*:0个或多个任意字符

?:任意单个字符

在通配符查询中,ElasticSearch引擎不会分析查询字符串,当文档的字段匹配通配符查询条件时,文档匹配。通配符查询会使查询性能变差,为了提高查询性能,推荐:查询字符串不要以通配符开头,只在查询字符串中间或末尾使用通配符。

{

  "query": {

    "wildcard": {

      "full_text":"qu*k"

    }

  }

}

七,正则表达式查询

ElasticSearch引擎支持正则表达式(RegExp)查询,对词条进行查询,这就意味着,在已分析(analyzed)的字符字段上,只能匹配单个分词的正则表达式,引擎把正则表达式应用到字符串字段的分词中,而不是应用到字段最原始的文本:

Elasticsearch will apply the regexp to the terms produced by the tokenizer for that field, and not to the original text of the field.

{

  "query": {

    "regexp": {

      "full_text":"qu[ic]{2}k"

    }

  }

}

如果想对字符串字段的原始文本执行正则表达式匹配,可以在不分析(not_analyzed)的字段上执行正则表达式查询,注意,字符的大小写。

{

  "query": {

    "regexp": {

      "exact_value":"Qui.*"

    }

  }

}

出处:http://www.cnblogs.com/ljhdo/p/4551490.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容