一些背景信息:在下面的示例中,用户搜索了" 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%')
重要的一点是,我只需要获取在标题或中断中同时包含两个单词的文档。我不想获取只有一个单词的文档。
我会在找到更多信息时更新问题。
更新:所选答案还提供了一种根据字段提升评分的方法。
答案 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"
}
}
}
_source
过滤数据集,以便只显示数组中提到的字段
将显示在结果中。
^2
表示使用数字2提升title
字段
operator:and
确保查询中的所有terms
必须匹配
在fields
答案 2 :(得分:0)
来自elasticsearch 5.2 doc: 一种选择是使用嵌套数据类型而不是对象数据类型。
此处有更多详情:https://www.elastic.co/guide/en/elasticsearch/reference/5.2/nested.html
希望这有帮助