设为首页 收藏本站
查看: 1793|回复: 0

[经验分享] ElasticSearch查询 第三篇:词条查询

[复制链接]

尚未签到

发表于 2017-7-1 19:01:33 | 显示全部楼层 |阅读模式
  《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.
  举个例子,创建索引,并索引文档:


DSC0000.gif DSC0001.gif


PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"full_text": {
"type":  "string"
},
"exact_value": {
"type":  "string",
"index": "not_analyzed"
}
}
}
}
}
PUT my_index/my_type/1
{
"full_text":   "Quick Foxes!",
"exact_value": "Quick Foxes!"  
}
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.*"
}
}
}
  参考文档:
  Elasticsearch Reference [2.4] » Query DSL » Term level queries
  Elasticsearch Reference [2.4] » Query DSL

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390155-1-1.html 上篇帖子: 分布式数据访问服务之1 下篇帖子: [UWP]爱恋动漫BT开发小记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表