Search APIs簡介
- query: 在請求消息體中的query允許我們用Query DSL的方式查詢。
- term: 查詢時判斷某個document是否包含某個具體的值,不會對被查詢的值進行分詞查詢
- match: 將被查詢值進行分詞,然後用評分機制(TF/IDF)進行打分
- match_phrase: 查詢指定段落
- Bool: 結合其他真值查詢,通常和must、should、mustnot(與或非)一起組合出複雜的查詢
- 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}