弹性搜索查询(类似于x和y)或(b像x和y)

时间:2017-05-06 06:37:16

标签: elasticsearch

一些背景信息:在下面的示例中,用户搜索了" HTML CSS"。我从搜索字符串中拆分每个单词并创建了下面看到的SQL查询。

现在我正在尝试创建一个与以下SQL查询具有相同逻辑的弹性搜索查询:

SELECT  
     title, description  
FROM `classes` 
WHERE 
    (`title` LIKE '%html%' AND `title` LIKE '%css%') OR 
    (description LIKE '%html%' AND description LIKE '%css%')

目前,已经有一半但似乎无法正确使用它。

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "title": "html"
          }
        },
        {
          "term": {
            "title": "css"
          }
        }
      ]
    }
  },
  "_source": [
    "title"
  ],
  "size": 30
}

现在我需要找到如何添加跟随逻辑

OR (description LIKE '%html%' AND description LIKE '%css%')

重要的一点是,我只需要获取在标题或中断中同时包含两个单词的文档。我不想获取只有一个单词的文档。

我会在找到更多信息时更新问题。

更新:所选答案还提供了一种根据字段提升评分的方法。

3 个答案:

答案 0 :(得分:2)

您可以尝试以下查询吗?您可以使用should进行or操作

{
 "query": {
  "bool": {
     "should": [
        {
           "bool": {
              "must": [
                 {
                    "match": {                      // Go for term if your field is analyzed
                       "title": {
                          "query": "html css",
                          "operator": "and",
                          "boost" : 2
                       }
                    }
                 }
              ]
           }
        },
        {
           "bool": {
              "must": [
                 {
                    "match": {
                       "description": {
                          "query": "html css",
                          "operator": "and"
                       }
                    }
                 }
              ]
           }
        }
     ],
     "minimum_number_should_match": 1
  }
 },
  "_source": [
    "title",
    "description"
   ]
}

希望这会有所帮助!!

答案 1 :(得分:1)

我认为在这种情况下使用的最合适的查询是Which shell used for git '!' aliases?

  

multi_match查询是运行same查询的便捷方式   多个领域。

因此您的查询可以写成:

GET /_search
{
  "_source": ["title", "description"],
  "query": {
    "multi_match": {
      "query": "html css",
      "fields": ["title^2", "description"],
      "operator":"and"
    }
  }
}
  1. _source过滤数据集,以便只显示数组中提到的字段 将显示在结果中。

  2. ^2表示使用数字2提升title字段

  3. operator:and确保查询中的所有terms必须匹配 在fields

答案 2 :(得分:0)

来自elasticsearch 5.2 doc: 一种选择是使用嵌套数据类型而不是对象数据类型。

此处有更多详情:https://www.elastic.co/guide/en/elasticsearch/reference/5.2/nested.html

希望这有帮助