国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch 基本使用(五)查詢條件匹配方式(query & query_string)

這篇具有很好參考價(jià)值的文章主要介紹了Elasticsearch 基本使用(五)查詢條件匹配方式(query & query_string)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概述

ES中常用的查詢類型往大了分可以分為簡單查詢,復(fù)合查詢,聚合查詢等;
而復(fù)合查詢及聚合查詢都是基于簡單查詢的;簡單查詢里面對條件的匹配方式又分為不同類型。term[s],match,match_all,match_phrase 等等

query

term

單詞查詢,在字段的倒排索引(發(fā)生分詞)或者直接在字段值(未發(fā)生分詞)中查找條件值,只要找到這個(gè)條件值就算匹配上,得分為1。

terms

多個(gè)單詞查詢,效果為 多個(gè) term 或者的邏輯。bool -> should -> term1,term2…

range

一般用于對數(shù)值類型進(jìn)行范圍查詢

match_all

無條件查詢,匹配所有數(shù)據(jù)

match

  • 根據(jù)文檔中實(shí)際存儲(chǔ)的字段類型(是否為分詞文本 text,keyword 不會(huì)進(jìn)行分詞),決定是否對條件值進(jìn)行分詞
  • 如果未分詞,直接以條件值執(zhí)行 term 查詢
  • 如果分詞,則對條件值進(jìn)行,分詞處理;
    • 若得到一個(gè)詞,也是執(zhí)行term查詢
    • 若得到多個(gè)詞,默認(rèn)執(zhí)行 terms 查詢(多個(gè)單詞 或者關(guān)系)
    • 也可以手動(dòng)指定為 且關(guān)系(如果為且,意思是,倒排索引后的詞表中要包含 條件分詞后的 所有單詞),通過以下方式指定 match 單詞之間的關(guān)系
    GET /stu/_search
    {
      "query": {
        "match": {
          "name": {
            "query": "張 四",
            "operator": "and"
          }
        }
      }
    }
    
    以上查詢 operator 默認(rèn)為 or,分詞 得到 兩個(gè)詞;
    可以查到 張三 李四 張三四 三個(gè)人。
    我們將 operator 指定為 and 后,只能查到 張三四 一個(gè)人了,必須包含條件分詞后的所有單詞。
match 匹配精度問題

對于match 分詞后的查詢;
and 是必須包含條件分詞后所有的單詞
or 是只需包含條件分詞后任意一個(gè)單詞。

and 下相對來說精度問題還好點(diǎn),畢竟要包含所有條件分詞單詞。
如果是在or的情況,我們想要定義至少包含幾個(gè)單詞才當(dāng)作匹配上,此時(shí)還需要另一個(gè)參數(shù) minimum_should_match 。
雖然在and情況下,用得相對較少,但對and也有效
此值也可以設(shè)置為百分比,意思是條件分詞后,達(dá)到比例的條件單詞匹配上才算匹配,
比如,以下查詢語句是查不出數(shù)據(jù)的

GET /stu/_search
{
  "query": {
    "match": {
      "name": {
        "query": "張 四",
        "operator": "and",
        "minimum_should_match": 3
      }
    }
  }
}

因?yàn)槟愕臈l件分詞,只有 2個(gè)詞,即使分詞也只得到2個(gè)詞, 小于 minimum_should_match

match_phrase

以當(dāng)前條件值,到文檔**字段(而非分詞后的列表)**里查詢。
條件不做分詞,到文檔字段內(nèi) 進(jìn)行連續(xù)的 文本匹配

match_pharse_prefix

同樣是以 條件不做分詞到文檔字段中查詢,但是條件最后的 單詞不是必須匹配字段內(nèi)的完整單詞
例如:
文檔字段為 i love you
條件為 i love yo
match_phrase 下 無法匹配,因?yàn)?文檔中 you 是一個(gè)完整的單詞;只能匹配 i 或者 i love 或者 i love you
match_pharse_prefix 就可以匹配,就是說只要是一個(gè)前綴包含的連續(xù)文本就能匹配

match_bool_prefix

條件進(jìn)行分詞,執(zhí)行 bool > should 查詢
前面的詞 做 term 查詢,最后一個(gè)詞做 perfix 查詢

multi_match

在實(shí)際開發(fā)中,特別是模糊查詢場景,可能需要將條件應(yīng)用到多個(gè)文檔字段上進(jìn)行匹配。
當(dāng)然我們可以使用 bool + should 的方式實(shí)現(xiàn)。
但ES已經(jīng)給我們提供了一種更為便捷的方式。
同時(shí)匹配 品牌或名稱 有蘋果的數(shù)據(jù)

"query": {
    "multi_match" : {
      "query":    "蘋果",
      "fields": [ "brand", "name" ] 
    }
  }

等價(jià)于

"query": {
    "bool": {
      "should": [
        {
          "match": {
            "brand": "蘋果"
          }
        },
        {
          "match": {
            "name": "蘋果"
          }
        }
      ]
    }
  }

query_string

以下是引用自ES社區(qū)博客中的一段描述

該查詢使用語法基于 OR,ANDNOT 等運(yùn)算符來解析和拆分提供的查詢字符串。 然后查詢在返回匹配文檔之前獨(dú)立分析每個(gè)拆分文本。
你可以使用 query_string 查詢創(chuàng)建一個(gè)復(fù)雜的搜索,其中包括通配符,跨多個(gè)字段的搜索等等。 盡管用途廣泛,但查詢是嚴(yán)格的,如果查詢字符串包含任何無效語法,則返回錯(cuò)誤。

簡單總結(jié):這是使用字符串通過 AND OR NOT 構(gòu)建復(fù)雜查詢的一種實(shí)現(xiàn)方式,但是語法較嚴(yán)格,容易出錯(cuò),并不推薦在日常查詢中使用

實(shí)際測試下來,單個(gè)條件執(zhí)行的應(yīng)該是match操作

簡單查詢一個(gè)字段

default_field:條件字段,只能一個(gè)。

GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "School Lane"
    }
  }
}

返回結(jié)果為 School Lane 的match查詢,凡是 address 包含 School 或者 Lane 的都匹配上
es 字符串匹配查詢,Elasticsearch,elasticsearch,大數(shù)據(jù),搜索引擎

在多個(gè)字段上應(yīng)用同一個(gè)條件 (類似multi_match)

上面的簡單查詢 通過 “default_field”: “字段名” 指定一個(gè)查詢字段。
當(dāng)要將條件應(yīng)用到多個(gè)字段時(shí),可以使用 “fields”: [“字段1”, “字段2”],

GET /bank/_search
{
  "query": {
    "query_string": {
      "fields": ["age", "account_number"], 
      "query": "26"
    }
  }
}

查詢 age match 26 或者 account_number match 26 的數(shù)據(jù)

在所有字段上應(yīng)用同一個(gè)條件 (超越了multi_match)

在所有字段上執(zhí)行match操作,只要任何一個(gè)字段匹配上就算匹配。
我們只需要去掉 fields 字段即可

GET /bank/_search
{
 "query": {
   "query_string": {
     "query": "28"
   }
 },
 "size": 2000
}

以上,在所有字段上應(yīng)用 match 28。
在 bank 這個(gè)索引下,查到了 age = 28 和 id = 28 的數(shù)據(jù)

對單個(gè)條件應(yīng)用多個(gè)值

多個(gè)值之間可以是 AND 或者 OR 的關(guān)系
  • 在所有字段上match 28 或者 30
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "28 OR 30"
    }
  },
  "size": 2000
}

指定字段 fields 或默認(rèn)字段 default_field都適用這個(gè)邏輯關(guān)系
NOT 關(guān)鍵字可以用在邏輯關(guān)系中任一項(xiàng)的前面,表示查詢相反條件

query_string

上面指定字段要么使用 fields ,要么使用 default_field,其實(shí)還有另一種更為靈活的方式,我們可以直接將字段寫到 query查詢語句中,
使用 query:“字段名: 條件值” 的方式靈活定制查詢條件

match 匹配
一個(gè)字段一個(gè)值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30"
    }
  },
  "size": 100
}
一個(gè)字段多個(gè)值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30 OR 20"
    }
  },
  "size": 100
}
多個(gè)字段一個(gè)值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30 OR account_number:1"
    }
  },
  "size": 100
}
多個(gè)字段多個(gè)值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: (30 OR 20) OR account_number: 1"
    }
  },
  "size": 100
}
模糊匹配(比match更強(qiáng)大,在match后的詞里面再進(jìn)行模糊匹配)

如下:
match Sedgwick

GET /bank/_search
{
  "query": {
    "match": {
      "address": "Sedgwick"
    }
  }
}

match 只能在分詞后的倒排索引中精確匹配
es 字符串匹配查詢,Elasticsearch,elasticsearch,大數(shù)據(jù),搜索引擎
如果把條件值改成 Sedgwic,去掉最后一個(gè) k,match就查不出來數(shù)據(jù)了。

但是使用 query_string 的模糊匹配依然有辦法查出來這兩條數(shù)據(jù)
query_string 的模糊匹配有兩個(gè)通配符

  • ?,統(tǒng)配一個(gè)字符,
  • *,統(tǒng)配任意多個(gè)字符
    使用以下語句都可以查出這兩條數(shù)據(jù)
  • ?匹配一個(gè)字符 k
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwic?"
    }
  }
}
  • *匹配一個(gè)字符 k
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwic*"
    }
  }
}
  • *匹配多個(gè)字符 ck
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwi*"
    }
  }
}
  • 前綴也能模糊
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "*dgwi*"
    }
  }
}

以上都能查出來那兩條數(shù)據(jù)。

范圍匹配

默認(rèn)的匹配方式為 match,其本質(zhì)就是 等值匹配,只是分不分詞的區(qū)別,
對于 query 中的 range 查詢,query_string 中也有對應(yīng)實(shí)現(xiàn)。
并且 query_string 還支持兩種寫法文章來源地址http://www.zghlxwxcb.cn/news/detail-707014.html

  • 區(qū)間寫法
    [ 表示包含起始值
    ] 表示包含結(jié)束值
    { 不包含起始值
    } 不包含結(jié)束值
    *表示不限制這一邊的值
    以下例子
    • [1 TO 2] :1 <= x <= 2
    • {1 TO 2} :1 < x < 2
    • [* TO 2] : x <= 2
      依然支持上面不同字段的寫法,這里只是舉個(gè)例子
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": "{* TO 20]"
    }
  }
}
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age:{* TO 20]"
    }
  }
}
  • 傳統(tǒng) > < 寫法
    • “>2” 大于2
    • ">=2"大于等于2
    • “>=2 AND <=5” 大于等于2且小于等于5
      與上面那些多條件,多個(gè)值,模糊查詢 不同維度之間 是可以混合使用的。
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": ">=20"
    }
  }
}

GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": ">=20 AND <30"
    }
  }
}

GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age:(>=20 AND <30)"
    }
  }
}
query_string 不同維度之間都是可以混用的(以上只是介紹了query_string基本用法,還有很多高級(jí)特性,具體可以參考官方文檔)

到了這里,關(guān)于Elasticsearch 基本使用(五)查詢條件匹配方式(query & query_string)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Elasticsearch:使用 query_string 查詢的短語及模糊查詢

    在我之前的文章系列里,我詳細(xì)描述了 query_string 的一些功能: Elasticsearch: query_string 查詢 Elasticsearch:以更簡單的方式編寫具有邏輯條件的 Elasticsearch 查詢 - query_string Elasticsearch:理解 query_string 和 simple_query_string 查詢 在今天的文章中,我們來聊聊 query_string 中的一下特殊查詢

    2024年02月09日
    瀏覽(19)
  • 【ElasticSearch-基礎(chǔ)篇】ES高級(jí)查詢Query DSL術(shù)語級(jí)別查詢并結(jié)合springboot使用

    Elasticsearch 提供了基于 JSON 的完整 Query DSL(Domain Specific Language)來定義查詢。 因Query DSL是利用Rest API傳遞JSON格式的請求體(RequestBody)數(shù)據(jù)與ES進(jìn)行交互,所以我們在使用springboot的時(shí)候也可以很方便的進(jìn)行集成,本文主要講述的就是使用springboot實(shí)現(xiàn)各類DSL的語法查詢。 Elastics

    2024年02月01日
    瀏覽(21)
  • ElasticSearch學(xué)習(xí)簡單使用(索引、文檔、分頁查詢、多條件查詢)

    ElasticSearch學(xué)習(xí)簡單使用(索引、文檔、分頁查詢、多條件查詢)

    APIfox接口在線文檔 安裝連接 下載鏈接(各個(gè)系統(tǒng),也包括docker) 打開 我下載的時(shí)window版本,直接就是zip壓縮包解壓后直接使用 執(zhí)行bin目錄下的這個(gè)bat文件,就會(huì)自動(dòng)打開終端運(yùn)行了。 大部分使用http請求進(jìn)行學(xué)習(xí)。 你需要一個(gè)接口工具,postman,APIfox,或者一些瀏覽器插件

    2024年02月03日
    瀏覽(25)
  • SpringBoot中進(jìn)行elasticSearch查詢,使用QueryBuilders構(gòu)建各類條件查詢

    BoolQueryBuilder對象使用must方法build,多個(gè)and使用多個(gè)must BoolQueryBuilder對象使用should方法build,多個(gè)or使用多個(gè)should使用 本篇文章如有幫助到您,請給「翎野君」點(diǎn)個(gè)贊,感謝您的支持。 首發(fā)鏈接:https://www.cnblogs.com/lingyejun/p/17557467.html

    2024年02月16日
    瀏覽(19)
  • SpringBoot+Elasticsearch使用resthighlevelclient對象查詢條件為“且+或”

    查詢年齡為15或者16或者17或者18的且班級(jí)為1班的學(xué)生信息 首先,確保您的項(xiàng)目中包含了 Elasticsearch 的依賴: 然后,您可以創(chuàng)建一個(gè)包含查詢邏輯的服務(wù)類。假設(shè)您有一個(gè)名為 StudentService 的服務(wù)類: 在上述代碼中,您需要替換 your_index_name 為實(shí)際的 Elasticsearch 索引名稱,并根

    2024年01月25日
    瀏覽(23)
  • sql語句轉(zhuǎn)為es查詢條件(elasticsearch-sql使用)

    github源碼地址: https://gitee.com/weiyxiong_admin/elasticsearch-sql/blob/master/src/test/java/org/nlpcn/es4sql/ExplainTest.java 1、添加pom.xml依賴 2、scala 將sql轉(zhuǎn)為es查詢json語句 3、測試 4、查詢返回結(jié)果展示(即步驟三esJSON結(jié)果打?。?5、打開postman

    2024年02月13日
    瀏覽(23)
  • ES delete_by_query條件刪除的幾種方式

    ?es 查詢刪除的幾種方式 1.根據(jù)id刪除 2.根據(jù)多個(gè)id刪除 3.根據(jù)多個(gè)id范圍刪除 注意:刪除完成后,執(zhí)行以下腳本回收索引空間 curl -XPOST http://127.0.0.1:9200/indexname/_forcemerge?max_num_segments=1?

    2024年02月09日
    瀏覽(20)
  • Elasticsearch Boolean Query查詢介紹

    前言 ES 和 Solr 的底層都是基于Apache Lucene 實(shí)現(xiàn),bool 查詢的底層實(shí)現(xiàn)是Lucene 的 BooleanQuery,其可以組合多個(gè)子句查詢,類似 SQL 語句里面的 OR 查詢。 查詢介紹 在 ES 里面 Boolean 查詢封裝了 4 種 API 接口能力,可以單獨(dú)使用,也可以組合使用,總結(jié)如下: 函數(shù) 描述 must query 關(guān)鍵

    2024年02月13日
    瀏覽(45)
  • ElasticSearch Index查詢(Query DSL)

    先貼一個(gè)Query DSL的官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html 我平時(shí)喜歡查看官方文檔,了解數(shù)據(jù)查詢和存儲(chǔ)方面的性能優(yōu)化點(diǎn),下面是積累的腳本分享。 查詢語句格式 查詢類型:match_all,match,term,range,fuzzy,bool 等等 查詢條件:查詢條件會(huì)根

    2024年02月07日
    瀏覽(23)
  • Elasticsearch復(fù)合查詢之Boosting Query

    Elasticsearch復(fù)合查詢之Boosting Query

    前言 ES 里面有 5 種復(fù)合查詢,分別是: Boolean Query Boosting Query Constant Score Query Disjunction Max Query Function Score Query Boolean Query在之前已經(jīng)介紹過了,今天來看一下 Boosting Query 用法,其實(shí)也非常簡單,總結(jié)起來就一句話,對不期待的查詢進(jìn)行相關(guān)性降分。 Boost 加權(quán)機(jī)制底層

    2024年02月12日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包