如何在elasticsearch中执行多级逻辑查询

时间:2017-02-24 11:30:19

标签: elasticsearch querydsl

让我们说我们有这样的查询

  

(a或b或c)和(x或y或z)和(f或g或h)...

我们如何使用Elasticsearch执行此类查询? 我尝试了bool查询,但我仍然困惑于必须,应该......子句以及如何在这些子句中放置不同的条件以获得逻辑结果

以下是我的数据样本(课程类型):

[{
        "_index": "training-hub",
        "_type": "courses",
        "_id": "58ad8090604aff26df131971",
        "_score": 1,
        "_source": {
          "title": "Getting Started with Vue.js",
          "description": "In this course, you will learn the basics of Vue.js framework and how to create amazing web applications using this framework",
          "slug": "hzrthtrjhyjyt--by--Jemli-Fathi",
          "format": [
            "Intra-entreprise"
          ],
          "duration": 6,
          "language": "EN",
          "requirements": [
            "Basics of web development"
          ],
          "tags": [],
          "audience": [
            "Web developers"
          ],
          "price": 600,
          "cover": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487840598/training-hub/k1h0tzciyjflqvtlyr2l.png",
          "scheduleUrl": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487765627/training-hub/sozofm68nrwxhta3ga3u.png",
          "trainer": {
            "firstname": "Jemli",
            "lastname": "Fathi",
            "photo": "https://ucarecdn.com/5923a1bb-3e77-47d0-bd5b-7d07b0f559fe/16487460_1269388943138870_3235853817844339449_o.jpg"
          },
          "courseCategory": {
            "name": "Game Development"
          },
          "createdAt": "2017-02-22T12:14:08.186Z",
          "updatedAt": "2017-02-24T10:39:22.896Z"
        }
      },
      {
        "_index": "training-hub",
        "_type": "courses",
        "_id": "58ad81c0604aff26df131973",
        "_score": 1,
        "_source": {
          "title": "Create your first Laravel application today!",
          "description": "In this course, you're gonna learn how create fancy web applications using Laravel PHP Framework ...",
          "slug": "sdvrehtrthrth--by--Jemli-Fathi",
          "format": [
            "Intra-entreprise",
            "Inter-entreprise"
          ],
          "duration": 6,
          "language": "EN",
          "requirements": [
            "Basics of Web development",
            "Basics of PHP language"
          ],
          "tags": [],
          "audience": [
            "Web developers",
            "PHP developers"
          ],
          "price": 600,
          "cover": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487841464/training-hub/dpgqbchualnfc78n69gs.png",
          "scheduleUrl": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487765627/training-hub/sozofm68nrwxhta3ga3u.png",
          "trainer": {
            "firstname": "Jemli",
            "lastname": "Fathi",
            "photo": "https://ucarecdn.com/5923a1bb-3e77-47d0-bd5b-7d07b0f559fe/16487460_1269388943138870_3235853817844339449_o.jpg"
          },
          "courseCategory": {
            "name": "Web Development"
          },
          "createdAt": "2017-02-22T12:19:12.376Z",
          "updatedAt": "2017-02-23T09:39:23.414Z"
        }
      },
      {
        "_index": "training-hub",
        "_type": "courses",
        "_id": "58aead4faecfc31e4559d49b",
        "_score": 1,
        "_source": {
          "title": "Getting Started with Docker",
          "description": "After taking this course, you will be able to use Docker in real life projects and you can bootstrap your projects into different containers",
          "slug": "regrehgreh--by--Jemli-Fathi",
          "format": [
            "Intra-entreprise"
          ],
          "duration": 5,
          "language": "EN",
          "requirements": [
            "Basic Linux Shell skills",
            "Basic knowledge of Linux environment"
          ],
          "tags": [],
          "audience": [
            "Dev-Ops",
            "Web Developers"
          ],
          "price": 999,
          "cover": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487939101/training-hub/vkqupkiqerq0kgjgd0km.png",
          "scheduleUrl": "http://res.cloudinary.com/dqihnnzaj/image/upload/v1487842509/training-hub/r9y1qisyfelseeuzgtt3.png",
          "trainer": {
            "firstname": "Jemli",
            "lastname": "Fathi",
            "photo": "https://ucarecdn.com/5acb1b5f-b550-4560-b085-2d75384e5ec8/13567067_1064268623650904_3773193220506255422_n.jpg"
          },
          "courseCategory": {
            "name": "Web Development"
          },
          "createdAt": "2017-02-23T09:37:19.758Z",
          "updatedAt": "2017-02-24T12:31:32.078Z"
        }
      }]

我需要的是过滤这样的课程:

  

(category1或category2 ...)和(format1或format2 ...)和   (language1或language2)......

2 个答案:

答案 0 :(得分:1)

Elasticsearch Query String Query的功能与您所寻找的相同。

请查看从官方文档here

中提取的以下代码段
GET /_search
{
    "query": {
        "query_string": {
            "query": "(content:this OR name:this) AND (content:that OR name:that)"
        }
    }
}

希望这有帮助!

答案 1 :(得分:1)

您可以将bool queriesterms query结合使用,以获得所需的行为

GET _search
{
    "query" : {
      "bool": {
        "must": [   //AND
          {
            "terms": {
              "category.name": [ // Category with value VALUE1 or VALUE2
                "VALUE1",
                "VALUE2"
              ]
            }
          },
          {
            "terms": {
              "format": [// format with value FORMAT1 or FORMAT2
                "FORMAT1",
                "FORMAT2"
              ]
            }
          },
          {
            "terms": {
              "language": [// language with value LANG1 or LANG2
                "LANG1",
                "LANG2"
              ]
            }
          }
        ]
      } 

    }
}

另外,请确保用于term匹配的字段为not_analyzed。 请从这里开始阅读映射:http://www.elasticsearch.org/guide/reference/mapping/