在Elasticsearch中执行这种类型的查询的正确方法是什么?



我正在尝试在Elasticsearch中查询,提供比我今天所做的更准确的结果。

在我的文档中,我有一个brand属性,一个description属性和一个size属性。一个示例文档可以是:

{
brand: "Coca Cola",
size: "1l",
description: "drink"
}

假设用户搜索"Coca Cola drink 1l"。现在,我想要下面的boost值:

  • brand:4
  • description:1
  • size:2

每个属性可以包含任何类型的字符串值,并且不受任何约束。此外,每个属性都使用自己的分析器(但为了简单起见,已从示例中删除)。

现在,实现上述目标的最佳方法是什么?

我已经试过了

方法1

这种方法搜索每个属性中的每个单词,每个属性具有不同的权重。它确保所有单词单独匹配至少一个属性。

{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{ "match": { "brand": { "boost": 4, "query": "Coca" } } },
{ "match": { "description": { "boost": 1, "query": "Coca" } } },
{ "match": { "size": { "boost": 2, "query": "Coca" } } }
],
"minimum_should_match": 1
}
},
{
"bool": {
"should": [
{ "match": { "brand": { "boost": 4, "query": "Cola" } } },
{ "match": { "description": { "boost": 1, "query": "Cola" } } },
{ "match": { "size": { "boost": 2, "query": "Cola" } } }
],
"minimum_should_match": 1
}
},
{
"bool": {
"should": [
{ "match": { "brand": { "boost": 4, "query": "drink" } } },
{ "match": { "description": { "boost": 1, "query": "drink" } } },
{ "match": { "size": { "boost": 2, "query": "drink" } } }
],
"minimum_should_match": 1
}
},
{
"bool": {
"should": [
{ "match": { "brand": { "boost": 4, "query": "1l" } } },
{ "match": { "description": { "boost": 1, "query": "1l" } } },
{ "match": { "size": { "boost": 2, "query": "1l" } } }
],
"minimum_should_match": 1
}
}
]
}
}
}

上述方法的问题是boost会关闭。品牌"Coca Cola"由两个单词组成,然后用8而不是4的值进行提升。

<标题>方法2 h1> 尝试使用多匹配查询(至少应该匹配"100%"),每个属性都有单独的提升。

我觉得这样更好一点,但是我不能为每个单独的属性指定一个分析器。

<标题>

3 方法我试着用整个句子来表示每个属性。我觉得这是正确的方式去,但然后搜索"foobar"仍然产生1个结果(出于某种原因)。

{
"query": {
"bool": {
"should": [
{ "match": { "brand": { "minimum_should_match": 1, "boost": 4, "query": "Coca Cola drink 1l" } } },
{ "match": { "description": { "minimum_should_match": 1, "boost": 1, "query": "Coca Cola drink 1l" } } },
{ "match": { "size": { "minimum_should_match": 1, "boost": 2, "query": "Coca Cola drink 1l" } } }
],
"minimum_should_match": 1
}
}
}

在这种情况下,可以使用多匹配查询,根据您的需要,有许多方法可以处理得分。

索引文件

POST test_mathias/_doc
{
"brand": "Coca Cola",
"size": "1l",
"description": "drink"
}

查询

POST test_mathias/_search
{
"query": {
"multi_match": {
"query": "Cola",
"fields": ["brand^4", "description^1", "size^2"]
}
}
}
<<p>反应/strong>
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.1507283,
"hits" : [
{
"_index" : "test_mathias",
"_type" : "_doc",
"_id" : "QdBP_XcB46EpgstaAC0C",
"_score" : 1.1507283,
"_source" : {
"brand" : "Coca Cola",
"size" : "1l",
"description" : "drink"
}
}
]
}
}

相关内容

  • 没有找到相关文章

最新更新