默认使用 空格拆分成 多个 子项,并且 每个子项 都会去分词 查询。可以通过 default_operator 指定  子项之间的关系。默认是 或 。 然后 每个 子项前面可以使用 -+ 指定必须有 或者必须么有。并且 加了修饰符 +- 的 提出单独算。

 

测试数据:

{
  "took": 4523,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
      {
        "_index": "test01",
        "_type": "doc",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "zhang san"
        }
      },
      {
        "_index": "test01",
        "_type": "doc",
        "_id": "4",
        "_score": 1,
        "_source": {
          "name": "xxx"
        }
      },
      {
        "_index": "test01",
        "_type": "doc",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "zhang yu kun"
        }
      },
      {
        "_index": "test01",
        "_type": "doc",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "li san"
        }
      }
    ]
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.

 

 

 

"query": "zhang san",
"default_operator": "OR"   可以查询 有 zhang  或者 san 的 。

 

"query": "zhang +san",
"default_operator": "OR"  查询出  必须有san  可以有zhang 的 数据。(   有修饰符的  是提出来优先算的,剩下的在算 或关系 。并且 或中至少要有一个  ),因为只剩一个or 所以这个 zhang 必须有 。所有就是 有 zhang  有 san

 

"query": "zhang -san",
"default_operator": "OR"  查询 必须没有san ,剩下 or 只有一个zhang  所以这个zhang  必须瞒住。所以就是  必须有zhang  ,但是必须没有san 

 

 

"query": "张三",
"default_operator": "OR"  依旧可以查到XXX,所以 是分词的。 分词以后是或 关系。并且+- 的修饰只能出现在词头。不能出现在词中

 

 

"query": "张三",
"default_operator": "AND"  这个就什么都查询不到了。说明  default_operator 对分词以后的term 生效。

 

 

加一个 
PUT /test01/doc/5
{
"name":"kun bo"
}

 

"query_string": {
"query": "zhang bo -san"  这时候查询出了新添加的那条 ,所以 没有 san , zhang 和 bo 带一个就可以。

 

"query_string": {
"query": "zhang bo +san"   这按照我的猜想应该是  必须有 san , zhang  bo 有一个 。但是 却 可以 zhang bo 都没有。 这个就不知道为啥了,姑且 当做 es 的 一个bugger 吧。

 

 

 

 

在说说  mach 查询  。mach 查询只是 分词以后查询。相当于  query_string  空格 隔开的 一个子项。