查詢msg字段中包含 receive order signal 和 -2 的信息,(不要包含2的,只要-2的)數據結構
1.普通query:spa
- {
- "query": {
- "bool": {
- "must": [
- {
- "match_phrase": {
- "msg": "\\-2"
- }
- },
- {
- "match":{"msg":"receive order signal"}
- }
- ]
- }
- }
- }
- 這種方式可能會查詢出2和-2的msg,由於es默認的分詞器(標準分詞器)在分詞時,會刪除特殊字符
2.使用query_string排序
- {
- "query":{
- "query_string" : {
- "default_field" : "msg",
- "analyzer" : "whitespace",
- "query" : "\\-2 AND receive AND order AND signal"
- }
- }
- }
- 這種方式仍是不行,緣由應該和上面同樣
3.使用keyword字段:索引
- {
- "query": {
- "wildcard": {
- "msg.keyword": {
- "value": "*receive*order*signal*-2*"
- }
- }
- }
- }
- Wildcard模糊匹配查詢(*),查詢msg的keyword字段
解析:內存
對於text類型的字段,es使用了一種基於內存的數據結構:fielddata來實現相似於正排索引的功能,以達到加速排序和聚合的目的。它是經過讀取磁盤上的每一個 segment(片斷)的整個反向索引來構建的,將 term(詞條)和 document(文檔)關係反轉,並將結果存儲在內存中,在JVM的堆中。它默認是關閉的,由於它太佔用內存。文檔
而doc_value也是一個相似於正排索引的結構,它對大多數字段都是默認開啓的(text字段不持之),而且數據類型爲keyword,它不會建立分詞,直接存儲在磁盤上,所以匹配查詢時,是能夠使用keyword字段的。string