elasticsearch 簡單實用介紹

Search APIs簡介

  • query: 在請求消息體中的query允許我們用Query DSL的方式查詢。
  • term: 查詢時判斷某個document是否包含某個具體的值,不會對被查詢的值進行分詞查詢
  • match: 將被查詢值進行分詞,然後用評分機制(TF/IDF)進行打分
  • match_phrase: 查詢指定段落
  • Bool: 結合其他真值查詢,通常和mustshouldmustnot(與或非)一起組合出複雜的查詢
  • range: 查詢時指定某個字段在某個特定的範圍 (gte:>=;gt:>;lte:<=;le:<)
  • from: 以一定的偏移量來查看我們檢索的結果,缺省從檢索的第一條數據開始顯示
  • size: 指定檢索結果中輸出的數據條數,缺省爲10條
  • sort: 允許我們將檢索的結果以指定的字段進行排序顯示
  • _source: 指定檢索結果輸出的字段
  • script_fields: 該類型允許我們通過一個腳本來計算document中不存在的值,比如我們需要計算install/click得到cti之類的
  • aggs: 基於搜索查詢,可以嵌套聚合來組合複雜的需求

返回數據含義

  • took:表示該操作的耗時(單位爲毫秒)
  • timed_out:表示是否超時
  • hits:表示命中的記錄
  • total:返回記錄數,本例是2條。
  • max_score:最高的匹配程度,本例是1.0。
  • hits:返回的記錄組成的數組。
  • _score:表示匹配的程序,默認是按照這個字段降序排列。


text字段和keyword字段的區別

字段被設置成  keyword  類型,錄入數據該字段是不會被分詞,所以使用term查詢時候,需要全匹配才能查詢到。

text,會將字段進行分詞,如“hello world”會被分詞爲["hello","world",...],而term必須匹配到數組中的一項,才能查出結果。

 

match,match_phrase和term區別

elastic會對查詢語句進行分詞


term

term 查詢語句不分詞

term查詢keyword字段

keyword字段不分詞
term查詢keyword字段,需要完全匹配

term查詢text字段

text字段分詞
term查詢text字段,必須爲text字段分詞後中的某一個才行。如“我真帥”分詞爲["我","真","帥"],term必須爲“我”或“真”或“帥”,才能查到,而“我帥”、“真帥”不行。


match

match 查詢語句分詞

match查詢keyword字段

keyword字段不分詞
match查詢keyword字段,需要完全匹配

match查詢text字段

text字段分詞
match查詢text字段,只需要match分詞結果中和text分詞有匹配就可以查出。如“我真帥”分詞爲["我","真","帥"],match的查詢語句“真帥”被分詞爲["真","帥"],其中“真”、“帥”能匹配上text字段的分詞結果,所以能查出。


match_phrase

match_phrase 查詢語句分詞

match_phrase 查詢keyword字段

keyword字段不分詞
match_phrase 查詢keyword字段,需要完全匹配

match_phrase 查詢text字段

text字段分詞
match_phrase 查詢text字段,只需要match_phrase 分詞結果中和text分詞有匹配且查詢語句必須包含在text分詞結果中,同時順序相同且連續,纔可以查出。如“我真帥”分詞爲["我","真","帥",“真帥”],match_phrase 的查詢語句“真帥”被分詞爲["真帥"],其中“真帥”能匹配上text字段的分詞結果,連續且順序相同,所以能查出。


ES與RDBMS數據庫比較

簡單對比

RDBMS Elasticsearch 備註
Database(數據庫) Index(索引)
Table(表) Type(類型) ES6.x後一個index對應一個type
Row(行) Docment(文檔) es保存json
Column(列) Field(字段)
Schema(約束) Mapping(映射) 只能說類似,不完全一樣
Index(所以) Everything is indexed(萬物皆爲索引) es中存儲數據都是索引
SQL(結構化查詢語言) DSL(ES獨特的查詢語言)

 

QueryBuilder 同時使用 should must

QueryBuilder query = QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.matchPhraseQuery("tablenamecn","*"+keyWords1 +"*")))
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.wildcardQuery("tablename","*"+keyWords1 +"*")));

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("disabled", 0))
                .must(QueryBuilders.matchQuery("tablestatus", 0))
                .must(QueryBuilders.matchQuery("type", TABLE_TYPE))
                .must(query);
 

bool 過濾

must :must子句(查詢)必須出現在匹配的文檔中,並有助於得分,類似於 and。

filter : filter子句(查詢)必須出現在匹配的文檔中。但是不同於 must查詢的分數將被忽略(必須匹配,運行在非評分&過濾模式)。

must_not :不包含條件查詢的數據,類似於 not,

should:至少有一個查詢條件匹配, 類似於 or。

 

1.例入我們查詢一個where field1 = xx and field2 in (xx,xxx,xxxx);

{
    "query":{
        "bool": {
            "must":[
                {"terms": {"field2":["xx","xxx","xxxx"]}},
                {"term" : {"field1":"xx "}}
            ]
        }
    }
}


2.例入我們查詢一個where field1 = xx and field2 =xx or field3 =xx and field4 !=xx;

{
    "query":{
        "bool": {
            "must":[
                {"term" : {"field1":"xx"}},
                {"term" : {"field2":"xx"}}
            ],
            "should":{"term" : {"field3":"xx"}},
            "must_not":{"term" : {"field4":"xx"}}
        }
    }
}

 

{
  "query": {
    "bool": {
      "must": [
        {"term": {"a": "1"}},
        {"term":{"b": "2"}}
        {
          "bool": {
            "should": [
                {"term": {"c": "1"}},
              {"term": {"d": "2"}}
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "time": {
      "order": "desc"
    }
  },
  "size": 100
}

 

4)範圍條件查詢

gt: > 大於

lt: < 小於

gte: >= 大於或等於

lte: <= 小於或等於

range查詢,它允許我們通過一定範圍的值來過濾文檔。這通常用於數字或日期過濾。例:

①.{ "query":{ "bool": { "filter": { "range":{ "stu_age":{ "gte":20, "lte":22 } } } } }}

5)wildcards :通配符查詢,類似模糊查詢。

{  "query": {    "wildcard": {      "field": "*xx*"    }  }}

(注:兩邊加*則匹配添加前後的所有符合的結果,可以使用正則匹配)

6)sort : 排序(sort":{"field ":{"order":"desc"}})

{ "query": { "match_all": {} }, "sort": { "field": { "order": "desc" } }}

7)_source :搜索指定的字段 ("_source":["field1","field2"])

{ "query": { "match_all": {} }, "_source": ["field1", "field2"]}

from : 查詢開始參數,from默認爲0.

size : 查詢條數;size未指定默認爲10.

{ "query": { "match_all": {} }, "from": 0, "size": 10}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章