ELK-ElasticSearch-查询

查询msg字段中包含 receive order signal 和 -2 的信息,(不要包含2的,只要-2的)数据结构

1.普通query:spa

  1. {
  2.   "query": {
  3.     "bool": {
  4.       "must": [
  5.         {
  6.           "match_phrase": {
  7.             "msg": "\\-2"
  8.           }
  9.         },
  10.         {
  11.           "match":{"msg":"receive order signal"}
  12.         }
  13.       ]
  14.     }
  15.   }
  16. }
  17. 这种方式可能会查询出2和-2的msg,由于es默认的分词器(标准分词器)在分词时,会删除特殊字符

 

2.使用query_string排序

  1. {
  2.   "query":{
  3.     "query_string" : {
  4.             "default_field" : "msg",
  5.             "analyzer" : "whitespace",
  6.             "query" : "\\-2 AND receive AND order AND signal"
  7.         } 
  8.     }
  9. }
  10. 这种方式仍是不行,缘由应该和上面同样

 

3.使用keyword字段:索引

  1. {
  2.   "query": {
  3.     "wildcard": {
  4.       "msg.keyword": {
  5.         "value": "*receive*order*signal*-2*"
  6.       }
  7.     }
  8.   }
  9. }
  10. Wildcard模糊匹配查询(*),查询msg的keyword字段


解析:内存

对于text类型的字段,es使用了一种基于内存的数据结构:fielddata来实现相似于正排索引的功能,以达到加速排序和聚合的目的。它是经过读取磁盘上的每一个 segment(片断)的整个反向索引来构建的,将 term(词条)和 document(文档)关系反转,并将结果存储在内存中,在JVM的堆中。它默认是关闭的,由于它太占用内存。文档

而doc_value也是一个相似于正排索引的结构,它对大多数字段都是默认开启的(text字段不持之),而且数据类型为keyword,它不会建立分词,直接存储在磁盘上,所以匹配查询时,是能够使用keyword字段的。string

相关文章
相关标签/搜索