44、初识搜索引擎_Query DSL搜索语法

2020-01-08  本文已影响0人  拉提娜的爸爸

1、什么是Query DSL

搜索内容在{···}中的就是Query DSL搜索,如:

GET /_search
{
    "query": {
        "match_all": {}
    }
}

2、Query DSL的基本语法

(1)语法
{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}

{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}
(2)示例
GET /test_index/test_type/_search
{
  "query": {
    "match": {
      "test_field": "test"
    }
  }
}
----------------------------结果----------------------------
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.25316024,
    "hits": [
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "7",
        "_score": 0.25316024,
        "_source": {
          "test_field": "test client 2"
        }
      },
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "8",
        "_score": 0.25316024,
        "_source": {
          "test_field": "test client 2"
        }
      },
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "1",
        "_score": 0.25316024,
        "_source": {
          "test_field": "test service 1"
        }
      }
    ]
  }
}

3、如何组合多个搜索条件

举例说明

(1)创建测试document数据
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "website",
        "_type": "article",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "my hadoop article",
          "content": "hadoop is very bad",
          "author_id": 111
        }
      },
      {
        "_index": "website",
        "_type": "article",
        "_id": "1",
        "_score": 1,
        "_source": {
          "title": "my elasticsearch article",
          "content": "es is very bad",
          "author_id": 110
        }
      },
      {
        "_index": "website",
        "_type": "article",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "my elasticsearch article",
          "content": "es is very bad",
          "author_id": 111
        }
      }
    ]
  }
}
(2)搜索需求:title必须包含elasticsearch,content可以包含elasticsearch也可以不包含,author_id必须不为111
GET /website/article/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "title": "elasticsearch"
        }}
      ],
      "should": [
        {"match": {
          "content": "elasticsearch"
        }}
      ],
      "must_not": [
        {"match": {
          "author_id": "111"
        }}
      ]
    }
  }
}
--------------------------------结果--------------------------------
{
  "took": 11,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.25316024,
    "hits": [
      {
        "_index": "website",
        "_type": "article",
        "_id": "1",
        "_score": 0.25316024,
        "_source": {
          "title": "my elasticsearch article",
          "content": "es is very bad",
          "author_id": 110
        }
      }
    ]
  }
}

bool.must:必须包含的参数值
bool.should:可以包含,也可以不包含的参数值
bool.must_not:必须不包含的参数值

(3)Query DSL也可以嵌套

如:

GET /test_index/_search
{
  "query": {
    "bool": {
      "must": {"match":{ "name": "tom" }},
      "should": [
          { "match": { "hired": true }},
          { "bool": {
            "must": { "match": { "personality": "good" }},
            "must_not": { "match": { "rude": true }}
            }
          }],
      "minimum_should_match": 1
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读