查询msg字段中包含 receive order signal 和 -2 的信息,(不要包含2的,只要-2的)
1.普通query:
- {
- "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字段的。