query_string查询

相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法。

测试数据

curl -XPOST  'http://localhost:9200/_bulk?pretty=true' -d '
{ "index": {"_index": "library", "_type": "book", "_id": "1"}}
{ "title": "All Quiet on the Western Front","otitle": "Im Westen nichts Neues","author": "Erich Maria Remarque","year": 1929,"characters": ["Paul Bäumer", "Albert Kropp", "Haie Westhus", "Fredrich Müller", "Stanislaus Katczinsky", "Tjaden"],"tags": ["novel"],"copies": 1, "available": true, "section" : 3}
{ "index": {"_index": "library", "_type": "book", "_id": "2"}}
{ "title": "Catch-22","author": "Joseph Heller","year": 1961,"characters": ["John Yossarian", "Captain Aardvark", "Chaplain Tappman", "Colonel Cathcart", "Doctor Daneeka"],"tags": ["novel"],"copies": 6, "available" : false, "section" : 1}
{ "index": {"_index": "library", "_type": "book", "_id": "3"}}
{ "title": "The Complete Sherlock Holmes","author": "Arthur Conan Doyle","year": 1936,"characters": ["Sherlock Holmes","Dr. Watson", "G. Lestrade"],"tags": [],"copies": 0, "available" : false, "section" : 12}
{ "index": {"_index": "library", "_type": "book", "_id": "4"}}
{ "title": "Crime and Punishment","otitle": "Преступлéние и наказáние","author": "Fyodor Dostoevsky","year": 1886,"characters": ["Raskolnikov", "Sofia Semyonovna Marmeladova"],"tags": [],"copies": 0, "available" : true}
'

查询语句

curl -XGET  'http://localhost:9200/library/book/_search?pretty=true' -d '{
  "query": {
    "query_string": {
      "query":  "title:crime^10 +title:punishment -otitle:cat +author: (+Fyodor +dostoevsky)",
      "default_field" : "title"
    }
  }
}'
//结果相同
curl -XGET  'http://localhost:9200/library/book/_search?pretty=true' -d '{
  "query": {
    "query_string": {
      "query":  "title:crime^10 +title:punishment -otitle:cat +author: (+Fyodor +dostoevsky)"
    }
  }
}'

解释: 1. 得到title字段中包含crime词条的文档,并且这些文档应该有10的加权。 2. 接下来文档title中包含punishment,而在otitle不包含cat。 3. 最后文档的author字段中包含Fyodor和dostoevsky关键词。

参数

  1. query:此参数指定查询文本。

  2. default_field:此参数指定默认的查询字段,默认值由index.query.default_field属性指定,默认为_all

针对多字段的query_string查询

针对多个字段做query_string查询,查询主体中提供一个fields参数,它是持有字段名称的数组。有两种方法针对多个字段运行query_string查询。

解释:针对title和otitle字段中包含crime punishment Neues三个关键词其中一个时均可匹配文档。

方法1: 最大分查询

方法2:multi_match 查询

simple_query_string 查询

simple_query_string查询同样支持Lucene查询语法;不同的是simple_query_string查询在解析查询query错误时不会抛出异常。

比如下面语句 故意将-otitle前面的空格去掉,造成query错误,但是运行查询语句,不会抛出异常。

Last updated

Was this helpful?