全文搜索的字段,如果想要查询一个用空格分开的词组,
例如:‘Gritty Hope’,使用什么样的es库查询语句,能达到查询出来的结果必须都包含这个词组,就是说,只包含‘Gritty’或‘Hope’的数据查询不出来。这两个单词都有的,也必须是‘Gritty Hope’这样的才能查询到。应该怎么写这个查询语句啊?
查询关键词:‘Gritty Hope’,
{
"id":'001',
"title": "Gritty Hope: now what could possibly go right?"
},
{
"id":'002',
"title": "gritty hope: now what could possibly go right?"
}
这两条可以查询出来,
{
"id":'002',
"title": "The Batman Trailer: Gritty, Haunting, & Fu*king Epic"
},
{
"id":'003',
"title": "Raymond James Keeps a Hold Rating on Hope Bancorp (HOPE)"
}
这两条查询不出来。
可以用这个,match查询。
GET your_index/_search
{
"query": {
"match": {
"title": {
"query": "Gritty Hope",
"operator": "AND"
}
}
}
}
###我前两天也弄过,不过是标签匹配的问题。本人也是新手,刚刚知道一点,给你说一下思路。
- 首先es会对所有的文档 text 类型进行分词的,英文默认是 空格区分,每一个单词就是底层的一个索引
- 不同的单词根据你当前的索引,他的权重是不一样的。
- 你这个需求换一种描述(可能不准确,但是对于我的标签来说很适合)可以是这样的,我想查阅的这一句话,匹配到了几个分词后的内容,就是我不想要他的权重分,我只是想知道次数,或者每一个单词的权重为 1,最后相加起来
- 查询就可以这样做:使用bool查询,把你要查询的单词通过空格分开,对每一个单词组合成 bool 下面的 should 查询,filter查询通过constant_score把权重设为1.大概按照下面
- 最后筛选权重等于单词分割后的大小,比如 大于2
{
"query": {
"bool": {
"should": [
{"constant_score": {
"filter": {"term": {
"tags": "aaaa" // 这个地方就是需要将单词空格区分开,每一个都这么组合
}
}
}},
{"constant_score": {
"filter": {"term": {
"tags": "bbb" // 这个地方就是需要将单词空格区分开,每一个都这么组合
}
}
}}
]
}
}
}
这个查询比如索引有数据:1aaa bbb
2aaa ccc
3bbb ccc
那么结果就是:1的得分为2, 2,3的得分为1
我也是刚知道es,我的需求可以这么做。有知道更好的可以留言:核心的诉求就是:我不要默认的评分,而是想知道他匹配成功了几次