日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ElasticSearch搜索语法学习(term,filter,bool,terms,range)

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ElasticSearch搜索语法学习(term,filter,bool,terms,range) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ES搜索語法學習


目錄

  • 原始數據
  • term,filter使用
  • bool組合多個filter條件來搜索數據
  • terms搜索多個值以及多值搜索結果優化
  • 基于range filter來進行范圍過濾
  • 手動控制全文檢索結果的精準度
  • dis_max實現best fields策略進行多字段搜索


  • 1. term,filter使用

    0. 原始數據(目錄1~2使用)
    POST /forum/article/_bulk { "index": { "_id": 1 }} { "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" } { "index": { "_id": 2 }} { "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" } { "index": { "_id": 3 }} { "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" } { "index": { "_id": 4 }} { "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }
    1. 根據用戶ID搜索帖子
    {"query" : {"constant_score" : { "filter" : {"term" : { "userID" : 1}}}} }
  • query:搜索
  • constant_score:默認
  • filter:過濾
  • term filter/query:對搜索文本不分詞,直接拿去倒排索引中匹配,你輸入的是什么,就去匹配什么。比如說,如果對搜索文本進行分詞的話,“helle world” --> “hello”和“world”,兩個詞分別去倒排索引中匹配term,“hello world” --> “hello world”,直接去倒排索引中匹配“hello world”
  • 相當于SQL中的單個where條件
  • 搜索其他字段類似

  • 2. bool組合多個filter條件來搜索數據

    1. 搜索發帖日期為2017-01-01,或者帖子ID為XHDK-A-1293-#fJ3的帖子,同時要求帖子的發帖日期絕對不為2017-01-02
  • SQL實現
  • select * from forum.article where (post_date='2017-01-01' or article_id='XHDK-A-1293-#fJ3') and post_date!='2017-01-02' GET /forum/article/_search {"query": {"constant_score": {"filter": {"bool": {"should": [{"term": { "postDate": "2017-01-01" }},{"term": {"articleID": "XHDK-A-1293-#fJ3"}}],"must_not": {"term": {"postDate": "2017-01-02"}}}}}} }
    2. 搜索帖子ID為XHDK-A-1293-#fJ3,或者是帖子ID為JODL-X-1937-#pV7而且發帖日期為2017-01-01的帖子
    select * from forum.article where article_id='XHDK-A-1293-#fJ3' or (article_id='JODL-X-1937-#pV7' and post_date='2017-01-01') GET /forum/article/_search {"query": {"constant_score": {"filter": {"bool": {"should": [{"term": {"articleID": "XHDK-A-1293-#fJ3"}},{"bool": {"must": [{"term":{"articleID": "JODL-X-1937-#pV7"}},{"term": {"postDate": "2017-01-01"}}]}}]}}}} }
  • bool:組合多個過濾條件
  • must:必須匹配
  • must_not:必須不匹配
  • should:可以匹配其中任意一個即可
  • bool可以嵌套
  • 相當于SQL中的多個and條件

  • 3. terms搜索多個值以及多值搜索結果優化

    0. 原始數據
    POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"tag" : ["java", "hadoop"]} } { "update": { "_id": "2"} } { "doc" : {"tag" : ["java"]} } { "update": { "_id": "3"} } { "doc" : {"tag" : ["hadoop"]} } { "update": { "_id": "4"} } { "doc" : {"tag" : ["java", "elasticsearch"]} }
  • term: {“field”: “value”}
  • terms: {“field”: [“value1”, “value2”]}
  • 相當于sql中的in
  • select * from tbl where col in ("value1", "value2")
    1. 搜索articleID為KDKE-B-9947-#kL5或QQPX-R-3956-#aD8的帖子
    GET /forum/article/_search {"query": {"constant_score": {"filter": {"terms": {"articleID": ["KDKE-B-9947-#kL5","QQPX-R-3956-#aD8"]}}}} }
    2. 搜索tag中包含java的帖子
    GET /forum/article/_search {"query" : {"constant_score" : {"filter" : {"terms" : { "tag" : ["java"]}}}} }
  • 此時會將tag中包含java字符串的結果返回
  • "took": 2,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 3,"max_score": 1,"hits": [{"_index": "forum","_type": "article","_id": "2","_score": 1,"_source": {"articleID": "KDKE-B-9947-#kL5","userID": 1,"hidden": false,"postDate": "2017-01-02","tag": ["java"]}},{"_index": "forum","_type": "article","_id": "4","_score": 1,"_source": {"articleID": "QQPX-R-3956-#aD8","userID": 2,"hidden": true,"postDate": "2017-01-02","tag": ["java","elasticsearch"]}},{"_index": "forum","_type": "article","_id": "1","_score": 1,"_source": {"articleID": "XHDK-A-1293-#fJ3","userID": 1,"hidden": false,"postDate": "2017-01-01","tag": ["java","hadoop"]}}]} }
    3. 優化搜索結果,僅僅搜索tag只包含java的帖子
  • 添加字段,標識tag數量
  • POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"tag_cnt" : 2} } { "update": { "_id": "2"} } { "doc" : {"tag_cnt" : 1} } { "update": { "_id": "3"} } { "doc" : {"tag_cnt" : 1} } { "update": { "_id": "4"} } { "doc" : {"tag_cnt" : 2} } GET /forum/article/_search {"query": {"constant_score": {"filter": {"bool": {"must": [{"term": {"tag_cnt": 1}},{"terms": {"tag": ["java"]}}]}}}} }
  • 如果tag包含[“java”, “hadoop”, “elasticsearch”],搜索的就是只包含"java", “hadoop”, "elasticsearch"其中一個字符串的數據
  • terms用于多值搜索
  • 優化terms多值搜索的結果
  • 相當于SQL中的in語句

  • 4. 基于range filter來進行范圍過濾

    0. 為帖子數據增加瀏覽量的字段

    POST /forum/article/_bulk
    { “update”: { “_id”: “1”} }
    { “doc” : {“view_cnt” : 30} }
    { “update”: { “_id”: “2”} }
    { “doc” : {“view_cnt” : 50} }
    { “update”: { “_id”: “3”} }
    { “doc” : {“view_cnt” : 100} }
    { “update”: { “_id”: “4”} }
    { “doc” : {“view_cnt” : 80} }

    1. 搜索瀏覽量在30~60之間的帖子
    GET /forum/article/_search {"query": {"constant_score": {"filter": {"range": {"view_cnt": {"gt": 30,"lt": 60}}}}} }
  • range:范圍搜索
  • gt:大于
  • gte:大于等于
  • lt:小于
  • lte:小于等于
  • 2. 搜索發帖日期在最近1個月的帖子
  • 添加數據
  • POST /forum/article/_bulk { "index": { "_id": 5 }} { "articleID" : "DHJK-B-1395-#Ky5", "userID" : 3, "hidden": false, "postDate": "2017-03-01", "tag": ["elasticsearch"], "tag_cnt": 1, "view_cnt": 10 } GET /forum/article/_search {"query": {"constant_score": {"filter": {"range": {"postDate": {"gt": "2017-03-10||-30d"}}}}} }GET /forum/article/_search {"query": {"constant_score": {"filter": {"range": {"postDate": {"gt": "now-30d"}}}}} }
  • range,相當于sql中的between,或者>=,<=,做范圍過濾。

  • 5. 手動控制全文檢索結果的精準度

    0. 為帖子數據增加標題字段

    POST /forum/article/_bulk
    { “update”: { “_id”: “1”} }
    { “doc” : {“title” : “this is java and elasticsearch blog”} }
    { “update”: { “_id”: “2”} }
    { “doc” : {“title” : “this is java blog”} }
    { “update”: { “_id”: “3”} }
    { “doc” : {“title” : “this is elasticsearch blog”} }
    { “update”: { “_id”: “4”} }
    { “doc” : {“title” : “this is java, elasticsearch, hadoop blog”} }
    { “update”: { “_id”: “5”} }
    { “doc” : {“title” : “this is spark blog”} }

    1. 搜索標題中包含java或elasticsearch的blog
  • 這個,就跟之前的那個term query,不一樣了。不是搜索exact value,是進行full text全文檢索。
  • match query,是負責進行全文檢索的。當然,如果要檢索的field,是not_analyzed類型的,那么match query也相當于term query。
  • GET /forum/article/_search {"query": {"match": {"title": "java elasticsearch"}} }
    2. 搜索標題中包含java和elasticsearch的blog
  • 搜索結果精準控制的第一步:靈活使用and關鍵字,如果你是希望所有的搜索關鍵字都要匹配的,那么就用and,可以實現單純match query無法實現的效果
  • GET /forum/article/_search {"query": {"match": {"title": {"query": "java elasticsearch","operator": "and"}}} }
    3. 搜索包含java,elasticsearch,spark,hadoop,4個關鍵字中,至少3個的blog
    GET /forum/article/_search {"query": {"match": {"title": {"query": "java elasticsearch spark hadoop","minimum_should_match": "75%"}}} }
    4. 用bool組合多個搜索條件,來搜索title
    GET /forum/article/_search {"query": {"bool": {"must": { "match": { "title": "java" }},"must_not": { "match": { "title": "spark" }},"should": [{ "match": { "title": "hadoop" }},{ "match": { "title": "elasticsearch" }}]}} }
    5. 搜索java,hadoop,spark,elasticsearch,至少包含其中3個關鍵字
  • 默認情況下,should是可以不匹配任何一個的,比如上面的搜索中,this is java blog,就不匹配任何一個should條件
  • 但是有個例外的情況,如果沒有must的話,那么should中必須至少匹配一個才可以。比如下面的搜索,should中有4個條件,默認情況下,只要滿足其中一個條件,就可以匹配作為結果返回
  • 但是可以精準控制,should的4個條件中,至少匹配幾個才能作為結果返回
  • GET /forum/article/_search {"query": {"bool": {"should": [{ "match": { "title": "java" }},{ "match": { "title": "elasticsearch" }},{ "match": { "title": "hadoop" }},{ "match": { "title": "spark" }}],"minimum_should_match": 3 }} }
  • 全文檢索的時候,進行多個值的檢索,有兩種做法,match query;should
  • 控制搜索結果精準度:and operator,minimum_should_match

  • 6. dis_max實現best fields策略進行多字段搜索

    0. 為帖子數據增加content字段
    POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"content" : "i like to write best elasticsearch article"} } { "update": { "_id": "2"} } { "doc" : {"content" : "i think java is the best programming language"} } { "update": { "_id": "3"} } { "doc" : {"content" : "i am only an elasticsearch beginner"} } { "update": { "_id": "4"} } { "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} } { "update": { "_id": "5"} } { "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }
    1. 搜索title或content中包含java或solution的帖子
  • 下面這個就是multi-field搜索,多字段搜索
  • GET /forum/article/_search {"query": {"bool": {"should": [{ "match": { "title": "java solution" }},{ "match": { "content": "java solution" }}]}} }
  • best fields策略,就是說,搜索到的結果,應該是某一個field中匹配到了盡可能多的關鍵詞,被排在前面;而不是盡可能多的field匹配到了少數的關鍵詞,排在了前面
  • dis_max語法,直接取多個query中,分數最高的那一個query的分數即可
  • GET /forum/article/_search {"query": {"dis_max": {"queries": [{ "match": { "title": "java solution" }},{ "match": { "content": "java solution" }}]}} }

    總結

    以上是生活随笔為你收集整理的ElasticSearch搜索语法学习(term,filter,bool,terms,range)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲丝袜中文字幕 | 国产精品极品白嫩 | 精品国产一区二区在线 | 九九视频免费看 | 精品视频成人 | 正在播放老肥熟妇露脸 | 久久99日 | 欧美日韩免费观看一区=区三区 | 一本色道久久88加勒比—综合 | 极品熟妇大蝴蝶20p 国产偷自拍视频 | 99久久久久久久 | 无码国产伦一区二区三区视频 | 日韩在线视频在线观看 | 国产喷水吹潮视频www | 福利片一区二区 | jizz日本视频 | 波多野结衣中文字幕一区二区三区 | 欧美高清v | 强行挺进白丝老师翘臀网站 | 日韩欧美毛片 | 欧美福利在线 | av老司机福利 | 精品一区二区三区四 | 国产视频在线观看一区 | 久久久久亚洲色欲AV无码网站 | 99视频网址 | 国产一区视频在线免费观看 | 精品一区二区三区精华液 | 成人午夜视频免费 | 成人mv | www.国产区 | 欧美日本一道本 | 欧美美女性高潮 | 国产欧美激情 | 牛牛av国产一区二区 | 国产三级在线免费 | 免费看污的网站 | av一二区| 操你啦影院 | 嫩草影院懂你的 | 国产手机精品视频 | 日本69少妇 | 天天操网 | 欧美成人久久 | 新91av| 干骚视频 | 国产精品传媒 | 久久成人精品一区二区 | 欧美乱子伦 | 91国产大片| 国产中年熟女高潮大集合 | 中文字幕在线观看免费 | 极品videosvideo喷水 | 国产一区二区视频免费 | 亚洲国产精品成人 | 超碰在线a| 嫩草在线观看 | 精品一区二区三区四区视频 | 久久人 | 日韩性生交大片免费看 | 无码精品黑人一区二区三区 | 国产乱淫av| 九九综合九九 | 亚洲影院中文字幕 | 久久久国产精品无码 | 中国特级黄色大片 | 白丝一区 | 国产精在线 | 欧美视频你懂的 | 欧美在线 | 亚洲 | 午夜黄色录像 | 久久久黄色 | 伊人网伊人网 | 国产大学生视频 | 神马影院一区二区 | 天天综合天天干 | 欧美aaaaaaaaa | 亚洲字幕av一区二区三区四区 | 国产小视频在线观看 | 久久色中文字幕 | 日韩一区免费观看 | 免费一级特黄特色大片 | 欧美成人免费一级 | 中文字幕欲求不满 | 国产成人三级在线播放 | 成人影音在线 | 拍国产真实乱人偷精品 | 波多野结衣电车 | 国产福利91精品一区二区三区 | 成 人 黄 色 片 在线播放 | 国产传媒中文字幕 | 国产一区二区三区电影在线观看 | 97超碰人 | 你懂的欧美 | 日本a一级片 | 亚洲美女中文字幕 | 另类二区 | 91视频区 | 无遮挡av|