Elasticsearch深入搜索与查询语言介绍DSL

Elasticsearch两种查询

  1. url 搜索 e.g. GET twitter/_search?q=user:kimchy
  2. DSL查询语言
    GET /_search
    {
    "query": { 
        "bool": { 
        "must": [
            { "match": { "title":   "Search"        }}, 
            { "match": { "content": "Elasticsearch" }}  
        ],
        "filter": [ 
            { "term":  { "status": "published" }}, 
            { "range": { "publish_date": { "gte": "2015-01-01" }}} 
        ]
        }
    }
    }

DSL(Domain Specific Language)

基本语法

GET /_search
{
    "query": <query clause>
}

查询分类

  • 根据目的分类
    • 上下文查询(Query context),简称查询
      在上下文查询语境中,查询语句会询问文档与查询语句的匹配程度,此外,它会判断文档是否匹配并计算相关性评分(_score)的值。
    • 上下文过滤(Filter context),简称过滤
      在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度(相关性评分)。过滤主要用于结构化的数据。
  • 根据查询语句分类
    叶子查询语句 : 用于查询特殊字段的特殊值,例如:match, term, range 等。
    复合查询语句 : 可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑。

查询语法

1. 全文查询


GET /_search
{
    "query" : {
        "match" : {
            "full_name" : "John Smith"
        },
        "multi_match": {
          "query": "John Smith",
          "fields": ["first_name", "full_name"]
        }
    }
}
  • match: 查询可操作文本、数值和日期类型的数据,分析它们并构建查询语句。
  • match_phrase: 即短语(词组)匹配,它会分析提供的查询文本并构建一个 phrase 查询。
  • match_phrase_prefix: 和 match_phrase 类似,但 match_phrase_prefix 不是精准匹配,而是前缀匹配,它会对查询文本的最后一个字符后的内容进行通配符搜索。
  • multi_match: 用于多字段匹配查询。

2. Term-level 查询

Term-level 查询是直接查询倒排索引中的确切的值。
Term-level 查询通常用于结构化的数据,如数值、日期、枚举值或关键字,而不是文本(text)

POST /_search
{
  "query": {
    "term" : { "first_name" : "john" } ,
    "terms" : { "full_name" : ["john", "john2"] },
    "range" : {
            "info.age" : {
                "gte" : 28,
                "lt" : 60,
                "boost" : 2.0
            }
        },
    "wildcard" : { "full_name" : "john*" },
    "regexp" : { "full_name" : "jo.*" },
     "type" : {
            "value" : "user"
        }

  }
}
  • term 用于查询指定字段的倒排索引包含某个确切值的记录。
  • terms 和 term 类似,只不过提供的确切的值是数组。类似于 MySQL 的 in 条件。
  • range 用于范围查询。
  • exists 返回字段值不为 null 的记录。
  • prefix 返回字段的 term 以确切的前缀(前缀不会被分析)开头的记录。
  • wildcard 指的是通配符查询。支持的通配符主要有:(* 匹配 0 个或多个任意字符, ? 匹配 1 个任意字符)
  • regexp 指的是正则查询。
  • fuzzy 指的是容差查询,即可以容忍确切的值和倒排索引中的 term 之间有误差。
  • type 查询指的是根据文档的 type 来查询。
  • ids 查询指的是根据文档的 id 来查询。

3. 复合查询


GET /_search
{
    "query": {
        "constant_score" : {
            "filter" : {
                "term" : { "full_name" : "john"}
            },
            "boost" : 1.5
        }
    }
}
  • constant_score 复合查询只会在过滤上下文中执行查询语句,并且返回的所有的记录的 _score 值是一个常量。
  • bool 复合查询用于组合叶子查询语句或复合查询语句。如:must, should, must_not, or filter。
    • must 必须匹配。
    • should 至少匹配一个文档。
    • filter 必须匹配,忽略相关性评分。
    • must_not 必须不匹配,忽略相关性评分。
    • 说明: must 和 should 在查询上下文中执行;must_not 和 filter 在过滤上下文中执行。

POST /_search
{
    "query": {
        "bool" : {
            "must" : {
              "term" : { "last_name" : "smith" }
            },
            "filter": {
              "term" : { "info.interests" : "musics" }
            },
            "must_not" : {
              "range" : {
                "info.age" : { "gte" : 10, "lte" : 25 }
              }
            },
            "should" : [
              { "term" : { "full_name" : "john" } },
              { "term" : { "full_name" : "smith" } }
            ],
            "minimum_should_match" : 1,
            "boost" : 2.0
        }
    }

参考:https://blog.csdn.net/lamp_yang_3533/article/details/97618687

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

推荐阅读更多精彩内容