我是 Elastic Search 的新手,所以任何提示或提示都将不胜感激!
我有一个索引,我想在其中检索一些与“my_id”字段的某些值完全匹配的条目。
这些是我的尝试: 查询1:
{
"min_score": 1,
"query": {
"bool": {
"must": [
{
"terms": {
"project": ["one"]
}
}
],
"filter": [
{ "terms": { "my_id": ["my_id_2", "my_id_1"] } }
]
}
}
}
-> 返回空命中。
查询2:
{
"min_score": 1,
"query": {
"bool": {
"must": [
{
"terms": {
"project": ["one"]
}
}
]
, "should": [
{
"match": {
"my_id": "my_id_1"
}
},
{
"match": {
"my_id": "my_id_2"
}
}
]
}
}
}
-> 返回比给定 my_id 的条目更多的条目。
我在这里不知所措,看不出有什么问题。我必须看一下分析仪吗?如果是基于文本或关键字的设置?如果是这样,你如何检查这些并更改这些?
预先感谢您的每一个回答和评论!
编辑:
这是字段类型:
"my_id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
在第二个代码片段中:
当你使用“should”和“must”时,当然,你会得到更多结果,因为“should”不一定是true;只需“must”就足以检索数据。例如,当您使用“must project = 'one'”时,这意味着它将使用 project =“one” 获取所有内容,无论“should”中包含什么。 “应该”只会增加额外分数;它不会过滤任何东西。
在第一个代码片段中:
没有任何问题;该查询似乎完全准确。您要做的就是首先匹配所有具有 (project == "one" && (my_id == "my_id_1" || my_id == "my_id_2")) 的数据。这正是正在发生的事情,而且应该有效。如果您没有得到结果,可能是由于以下两个原因之一:删除 "min_score": 1,或者确保数据库中有数据 project = "one" 和 my_id = " my_id_1”或“my_id_2”因为查询必须检索数据,而且分析器没有任何问题。
此外,还有一些我觉得你可能不知道的事情你应该知道:
Filter 和 Must 正在做完全相同的事情,唯一的区别是 filter 不会对结果进行评分。
Should 没有做任何事情,它只是为结果添加额外的分数。这意味着如果您删除 should,结果将是相同的,但只是分数较低。
Term和Match几乎相同,不同的是term是根据精确匹配(“data”==“data”)进行搜索,而match是根据文本分析器进行搜索意思是你可以搜索句子的一部分,(“数据”==“数据库中的数据”)
(AND)、(OR)、(Relationship)逻辑:
我会尽力解释这部分,我会编写代码和查询比较:
第一个例子:
代码:
if(a == 1 && b == 2){ getdata(); }
查询:
"query": {
"bool": {
"must": [
{
"term": { "a": 1 },
"term": { "b": 2 }
}
]
}
}
意味着 {term},{term} 这个关系是 (AND)
第二个例子:
代码:
if(a == 1 || b == 2){ getdata(); }
查询:
"query": {
"bool": {
"must": [
{
"terms": { "a": [1,2] }
}
]
}
}
意味着 {terms[1,2]} 这个关系是 (OR)
第三个例子:
代码:
Doc dataArray1[];
Doc dataArray2[];
if(a==1) {
dataArray1 = getdata();
}
if(b==2) {
dataArray2 = getdata();
}
intersection(dataArray1, dataArray2);
查询:
"query": {
"bool": {
"must": [
{
"term": { "a": 1 }
}
],
"filter" : [
{
"term": { "b": 2 }
}
]
}
}
意味着任何 bool 查询之间的关系都是交集,但我们将排除 should。
第四个例子:
代码:
Doc dataArray1[];
Doc dataArray2[];
Doc dataArray3[];
Doc res[];
if(a==1) {
dataArray1 = getdata();
}
if(b==2) {
dataArray2 = getdata();
}
if(c==3) {
dataArray3 = getdata();
}
res = intersection(dataArray1, dataArray2);
for(Doc d : dataArray3) {
res[d].score++;
}
查询:
"query": {
"bool": {
"must": [
{
"term": { "a": 1 }
}
],
"filter" : [
{
"term": { "b": 2 }
}
],
"should" : [
{
"term": { "c": 3 }
}
]
}
}
意思是应该只是增加一个分数,仅此而已。
代码不是要运行的东西,它只是为了解释每个代码背后的想法或逻辑,Elasticsearch 的后端不一定是这样工作的,我只是举这些例子来演示并使其更容易理解