ES:Query DSL搜尋語法
1、Query DSL的基本語法
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
例:
GET /test_index/test_type/_search { "query": { "match": { "test_field": "test" } } }
2、如何組合多個搜尋條件
bool 查詢與 bool 過濾相似,用於合併多個查詢子句。不同的是,bool 過濾可以直接給出是否匹配成功, 而bool 查詢要計算每一個查詢子句的 _score (相關性分值)。
- must:: 查詢指定文件一定要被包含。
- must_not:: 查詢指定文件一定不要被包含。
- should:: 查詢指定文件,有則可以為文件相關性加分。
3、filter與query對比
filter,僅僅只是按照搜尋條件過濾出需要的資料而已,不計算任何相關度分數,對相關度沒有任何影響
query,會去計算每個document相對於搜尋條件的相關度,並按照相關度進行排序
一般來說,如果你是在進行搜尋,需要將最匹配搜尋條件的資料先返回,那麼用query;如果你只是要根據一些條件篩選出一部分資料,不關注其排序,那麼用filter
除非是你的這些搜尋條件,你希望越符合這些搜尋條件的document越排在前面返回,那麼這些搜尋條件要放在query中;如果你不希望一些搜尋條件來影響你的document排序,那麼就放在filter中即可
filter,不需要計算相關度分數,不需要按照相關度分數進行排序,同時還有內建的自動cache最常使用filter的資料
query,相反,要計算相關度分數,按照分數進行排序,而且無法cache結果
4、各種query搜尋語法
1、match all
可以查詢到所有文件,是沒有查詢條件下的預設語句。
GET /_search
{
"query": {
"match_all": {}
}
}
此查詢常用於合併過濾條件。 比如說你需要檢索所有的郵箱,所有的文件相關性都是相同的,所以得到的_score為1.
2、match
match查詢是一個標準查詢,不管你需要全文字查詢還是精確查詢基本上都要用到它。
如果你使用 match 查詢一個全文字欄位,它會在真正查詢之前用分析器先分析match一下查詢字元:
GET /_search
{
"query": {
"match": {
"title": "my elasticsearch article"
}
}
}
做精確匹配搜尋時,你最好用過濾語句,因為過濾語句可以快取資料。
3、multi match
multi_match查詢允許你做match查詢的基礎上同時搜尋多個欄位,在多個欄位中同時查一個
GET /company/employee/_search
{
"query": {
"multi_match": {
"query": "xian",
"fields": ["address.*", "name"]
}
}
}
4、range query
range過濾允許我們按照指定範圍查詢一批資料:
- gt :: 大於
- gte:: 大於等於
- lt :: 小於
- lte:: 小於等於
GET /company/employee/_search
{
"query": {
"range": {
"age": {
"gte": 30
}
}
}
}
5、term query
term主要用於精確匹配哪些值,比如數字,日期,布林值或 not_analyzed 的字串(未經分析的文字資料型別):
GET /company/employee/_search
{
"query": {
"term": {
"join_date": "2015-01-01"
}
}
}
6、terms query
terms 跟 term 有點類似,但 terms 允許指定多個匹配條件。 如果某個欄位指定了多個值,那麼文件需要一起去做匹配:
GET /company/employee/_search
{
"query": {
"terms": {
"age": [
30,
35
]
}
}
}