1. 程式人生 > >Elasticsearch 的查詢操作

Elasticsearch 的查詢操作

es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
由於DSL查詢更為直觀也更為簡易,所以大都使用這種方式。
DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式。

這裡有一個地方注意的是官方文件裡面給的例子的json結構只是一部分,並不是可以直接黏貼複製進去使用的。一般要在外面加個query為key的機構。

match

最簡單的一個match例子:

查詢和"我的寶馬多少馬力"這個查詢語句匹配的文件。

{ "query": { "match": { "content" : { "

query" : "我的寶馬多少馬力" } } }}

上面的查詢匹配就會進行分詞,比如"寶馬多少馬力"會被分詞為"寶馬 多少 馬力", 所有有關"寶馬 多少 馬力", 那麼所有包含這三個詞中的一個或多個的文件就會被搜尋出來。
並且根據lucene的評分機制(TF/IDF)來進行評分。

match_phrase

比如上面一個例子,一個文件"我的保時捷馬力不錯"也會被搜尋出來,那麼想要精確匹配所有同時包含"寶馬 多少 馬力"的文件怎麼做?就要使用 match_phrase 了

{ "query": { "match_phrase": { "content" : { "query" :
"我的寶馬多少馬力" } } }}

完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop。

{ "query": { "match_phrase": { "content" : { "query" : "我的寶馬多少馬力", "slop" : 1 } } }}

multi_match

如果我們希望兩個欄位進行匹配,其中一個欄位有這個文件就滿足的話,使用multi_match

{ "query": { "multi_match": { "query" : "我的寶馬多少馬力", "fields" : ["title","content"
] } }}

但是multi_match就涉及到匹配評分的問題了。

{ "query": { "multi_match": { "query":"我的寶馬發動機多少", "type":"best_fields", "fields": [ "tag","content" ], "tie_breaker":0.3 } }}

意思就是完全匹配"寶馬 發動機"的文件評分會比較靠前,如果只匹配寶馬的文件評分乘以0.3的係數

我們希望越多欄位匹配的文件評分越高,就要使用most_fields

{ "query": { "multi_match": { "query":"我的寶馬發動機多少", "type":"most_fields", "fields": [ "tag","content" ] } }}

我們會希望這個詞條的分詞詞彙是分配到不同欄位中的,那麼就使用cross_fields

{ "query": { "multi_match": { "query":"我的寶馬發動機多少", "type":"cross_fields", "fields": [ "tag","content" ] } }}

-------------------------------------------------------------------------------------------------------------------

term是代表完全匹配,即不進行分詞器分析,文件中必須包含整個搜尋的詞彙

{ "query": { "term": { "content":"汽車保養" } }}

查出的所有文件都包含"汽車保養"這個片語的詞彙。

使用term要確定的是這個欄位是否“被分析”(analyzed),預設的字串是被分析的。

拿官網上的例子舉例:

mapping是這樣的:

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!" }

其中的full_text是被分析過的,所以full_text的索引中存的就是[quick, foxes],而extra_value中存的是[Quick Foxes!]。

那下面的幾個請求:

GET my_index/my_type/_search{"query": { "term": { "exact_value":"Quick Foxes!" } }} 請求的出資料,因為完全匹配

GET my_index/my_type/_search{"query": { "term": { "full_text":"Quick Foxes!" } }} 請求不出資料的,因為full_text分詞後的結果中沒有[Quick Foxes!]這個分詞。

bool聯合查詢: must,should,must_not

如果我們想要請求"content中帶寶馬,但是tag中不帶寶馬"這樣類似的需求,就需要用到bool聯合查詢。
聯合查詢就會使用到must,should,must_not三種關鍵詞。

這三個可以這麼理解

  • must: 文件必須完全匹配條件
  • should: should下面會帶一個以上的條件,至少滿足一個條件,這個文件就符合should
  • must_not: 文件必須不匹配條件

比如上面那個需求:

{ "query": { "bool": { "must": { "term": { "content":"寶馬" } }, "must_not": { "term": { "tags":"寶馬" } } } }}

相關推薦

Elasticsearch Essentials——Elasticsearch查詢操作

Query string 查詢可以將需要查詢的條件組裝在一起形成字串,來進行復雜的資料查詢。例如GET /oa/employee/_search?q=gender:male&sort=age:desc,這串查詢的結果就是以age為降序排序的所有的male

elasticsearch基本操作之--使用QueryBuilders進行查詢

constant false cor ble conn 中一 listen terms int /** * 系統環境: vm12 下的centos 7.2 * 當前安裝版本: elasticsearch-2.4.0.tar.gz */ QueryBuilder 是es

ElasticSearch常用操作查詢與聚合篇

使用 目的 復雜 但是 應用 條件 說明 exist 5.4 [TOC] 0 說明 基於es 5.4和es 5.6,列舉的是個人工作中經常用到的查詢(只是工作中使用的是Java API),如果需要看完整的,可以參考官方相關文檔https://www.elastic.co/

elasticsearch(二)java 使用同步步方法進行查詢操作

一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(

Elasticsearch中的兩種查詢操作query和filter

  ES中的查詢操作分為2種:查詢(query)和過濾(filter)。 查詢即是之前提到的query查詢,它(查詢)預設會計算每個返回文件的得分,然後根據得分排序。 而過濾(filter)只會篩選出符合的文件,並不計算得分,且它可以快取文件。所以,單從效能考慮,過濾比查詢更快

Elasticsearch查詢操作

es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。由於DSL查詢更為直觀也更為簡易,所以大都使用這種方式。DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式。

elasticsearch-查詢基礎篇

cor 結構 one and string 以及 sco 高級 posit elasticsearch的查詢有兩部分組成:query and filter。 兩者的主要區別在於:filter是不計算相關性的,同時可以cache。因此,filter速度要快於query。 先

ThinkPHP5.0 模型查詢操作

asc div code all 個數 關聯 開啟 val user 1、獲取單個數據 //取出主鍵為1的數據 $user = User::get(1); echo $user->name; // 使用數組查詢 $user = User::get([‘name‘

06-查詢操作(DQL)

過濾 函數 外鍵約束 分頁查詢 外鍵 內連接 單表 soft 兩個 一. 綜述 查詢操作主要從兩個方面來說:單表查詢和多表查詢。 單表查詢包括:簡單查詢、過濾查詢、結果查詢、分頁查詢、聚集函數;多表查詢包括:笛卡爾積、外鍵約束、內連接查詢、外鏈接查詢、自連接查詢。 二

elasticsearch常用操作

response spa pda 插件 cat 滾動 max 常用 post 3.3.1 Preparing a query 準備查詢請求 import org.elasticsearch.action.search.SearchResponse; import or

ElasticSearch 查詢

elasticsearch查詢刪除更多關於查詢:http://blog.csdn.net/laoyang360/article/details/51931981 http://www.cnblogs.com/xing901022/category/642865.htmlElasticSearch 查詢

MYSQL中的多類型查詢及高級查詢操作

最大值 -s 當前 and 最大 笛卡爾 rand 必須 min   離散查詢select * from car where price=30 or price=40 or price=50 or price=60;select * from car where price

ELK 學習筆記之 elasticsearch Mget操作

get arch curl idt under alt ima .cn blog Mget操作: 查詢多個文檔: curl -XGET ‘http://192.168.1.151:9200/_mget‘ -d ‘{"docs": [{"_index": "library

elasticsearch更新操作java

nts earch email ear java art cut bsp ace /** * 更新操作,更新某個_id下的field的值 * @throws IOException */public static void UpdateDoc() throws IOExce

django---查詢操作

com 列表 blog 但是 開頭 查找 get 多個 去重 1)queryset對象: 表示的是一個列表裏面有多個類對象的集合,, all()方法和filter()方法,查找出來的都是queryset方法 2)model對象:只有一個對象 get()方法查找出來的

Elasticsearch-基本操作1

index true 結果 大寫 block 自動生成 超時 delet 類型 Elasticsearch版本:6.0一、文檔一個文檔不僅包含數據,也包含元數據,三個必須的元數據如下_index:具有共同特性分到一起的文檔集合,標示了文檔的存放位置; 名字小寫,不以下

數據庫查詢操作(fetchone,fetchall)

一個 而在 mysql 沒有 備註 sele one 訪問 使用 數據庫查詢操作 Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。 fetchone(): 該方法獲取下一個查詢結果集

mongodb查詢操作分析

stats rec dex mes sub n) 方法 3.1 and 背景 mongodb 提供了類sql的數據查詢及操作方式,同時也包含了聚合操作、索引等多個機制; 按以往的經驗,不當的庫表操作或索引模式往往會造成許多問題,如查詢操作緩慢、數據庫吞吐量低下、CPU或磁盤

簡單的數據庫查詢操作

出現 mil course body 函數 not 排序 where子句 目標 格式: select <目標列名序列> ---需要哪些列from <表名> ---來自於哪些表where <行選擇條件> ---根據

Elasticsearch教程 Elasticsearch查詢語法 Elasticsearch權威指南 深入理解Elasticsearch

廣度 int ldd 流量 讀寫性能 word har 優先 廣度優先 課程大綱 第1節結構化搜索_IT技術論壇案例背景介紹 9分鐘 第2節結構化搜索_在案例中實戰使用term filter來搜索數據 20分鐘 第3節結構化搜索_filter執行原理深度剖析(bitset機