具有不同权重的多字段 Elasticsearch 补全建议器
Elasticsearch completion suggester on multifield with different weighting
我在 Elasticsearch 中使用 Completion Suggester 来允许部分单词匹配查询。在我的索引 (products_index) 中,我希望能够同时查询 product_name 字段和 brand 场地。这是我的映射:
POST /product_index
mappings: {
products: {
properties: {
brand: {
type: "string",
analyzer: "english"
},
product_name: {
type: "string",
analyzer: "english"
},
id: {
type: "long"
},
lookup_count: {
type: "long"
},
suggest: {
type: "completion",
analyzer: "simple",
payloads: true,
preserve_separators: true,
preserve_position_increments: true,
max_input_length: 50
},
upc: {
type: "string"
}
}
}
}
这是我的数据:
POST /product_index/products/2
{
id: 2,
brand: "Coca-Cola",
product_name: "Classic Coke",
suggest: {
input: [
"Classic Coke",
"Coca-Cola"
],
output: "Classic Coke - Coca-Cola",
payload: {
id: 2,
product_name: "Classic Coke",
brand: "Coca-Cola",
popularity: 10
},
weight: 0
}
}
这是我的查询:
POST /product_index/_search
"suggest": {
"product_suggest": {
"text": 'coca-co',
"completion": {
"field": 'suggest'
}
}
}
这很好用,除了我想给 product_name 字段一个比 brand 字段更高的权重.有什么办法可以做到这一点?我已经研究过这个 article 关于使用 bool 查询,但我对 Elasticsearch 很陌生,不确定如何在完成建议的情况下应用它。
非常感谢!
完成建议者实际上在得分方面非常有限:你不能那样做。您唯一可以做的就是增加一些条目,而不是条目内的属性(参见 weight
选项 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#indexing)。
那是因为 Completion Suggester 不执行 "real search" -> 它不使用索引。这是一个简单的 "dictionary" 设计用于 "prefix" 比索引 + 倒排列表更快的扩展。
您应该尝试一下 Algolia -> 该引擎旨在实时响应前缀搜索 + 每个属性具有不同的 "weights"。这是一个针对多个字段实现自动完成菜单的教程
正如 redox 所说,完成建议器非常简单,不支持条目提升。
我的解决方案是制作两个建议字段,一个用于品牌,一个用于产品名称:
POST /product_index
{
"mappings": {
"products": {
"properties": {
"brand": {
"type": "string",
"analyzer": "english"
},
"product_name": {
"type": "string",
"analyzer": "english"
},
"id": {
"type": "long"
},
"lookup_count": {
"type": "long"
},
"product-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"brand-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"upc": {
"type": "string"
}
}
}
}
}
索引时,填写两个字段:
POST /product_index/products/2
{
"id": 2,
"brand": "Coca-Cola",
"product_name": "Classic Coke",
"brand-suggest": {
"input": [
"Coca-Cola"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
},
"product-suggest": {
"input": [
"Classic Coke"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
}
}
查询时,在品牌和产品建议者上做一个建议:
POST /product_index/_search
{
"suggest": {
"product_suggestion": {
"text": "coca-co",
"completion": {
"field": "product-suggest"
}
},
"brand_suggestion": {
"text": "coca-co",
"completion": {
"field": "brand-suggest"
}
}
}
}
您可以将品牌建议的建议列表附加到产品建议的建议列表中,去除重复后,得到只有相关建议、没有重复的建议列表和产品建议。
另一种解决方案是使用提升品牌和产品的查询,而不是使用建议器。但是,此实现速度较慢,因为它不使用建议器。
我在 Elasticsearch 中使用 Completion Suggester 来允许部分单词匹配查询。在我的索引 (products_index) 中,我希望能够同时查询 product_name 字段和 brand 场地。这是我的映射:
POST /product_index
mappings: {
products: {
properties: {
brand: {
type: "string",
analyzer: "english"
},
product_name: {
type: "string",
analyzer: "english"
},
id: {
type: "long"
},
lookup_count: {
type: "long"
},
suggest: {
type: "completion",
analyzer: "simple",
payloads: true,
preserve_separators: true,
preserve_position_increments: true,
max_input_length: 50
},
upc: {
type: "string"
}
}
}
}
这是我的数据:
POST /product_index/products/2
{
id: 2,
brand: "Coca-Cola",
product_name: "Classic Coke",
suggest: {
input: [
"Classic Coke",
"Coca-Cola"
],
output: "Classic Coke - Coca-Cola",
payload: {
id: 2,
product_name: "Classic Coke",
brand: "Coca-Cola",
popularity: 10
},
weight: 0
}
}
这是我的查询:
POST /product_index/_search
"suggest": {
"product_suggest": {
"text": 'coca-co',
"completion": {
"field": 'suggest'
}
}
}
这很好用,除了我想给 product_name 字段一个比 brand 字段更高的权重.有什么办法可以做到这一点?我已经研究过这个 article 关于使用 bool 查询,但我对 Elasticsearch 很陌生,不确定如何在完成建议的情况下应用它。
非常感谢!
完成建议者实际上在得分方面非常有限:你不能那样做。您唯一可以做的就是增加一些条目,而不是条目内的属性(参见 weight
选项 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#indexing)。
那是因为 Completion Suggester 不执行 "real search" -> 它不使用索引。这是一个简单的 "dictionary" 设计用于 "prefix" 比索引 + 倒排列表更快的扩展。
您应该尝试一下 Algolia -> 该引擎旨在实时响应前缀搜索 + 每个属性具有不同的 "weights"。这是一个针对多个字段实现自动完成菜单的教程
正如 redox 所说,完成建议器非常简单,不支持条目提升。 我的解决方案是制作两个建议字段,一个用于品牌,一个用于产品名称:
POST /product_index
{
"mappings": {
"products": {
"properties": {
"brand": {
"type": "string",
"analyzer": "english"
},
"product_name": {
"type": "string",
"analyzer": "english"
},
"id": {
"type": "long"
},
"lookup_count": {
"type": "long"
},
"product-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"brand-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"upc": {
"type": "string"
}
}
}
}
}
索引时,填写两个字段:
POST /product_index/products/2
{
"id": 2,
"brand": "Coca-Cola",
"product_name": "Classic Coke",
"brand-suggest": {
"input": [
"Coca-Cola"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
},
"product-suggest": {
"input": [
"Classic Coke"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
}
}
查询时,在品牌和产品建议者上做一个建议:
POST /product_index/_search
{
"suggest": {
"product_suggestion": {
"text": "coca-co",
"completion": {
"field": "product-suggest"
}
},
"brand_suggestion": {
"text": "coca-co",
"completion": {
"field": "brand-suggest"
}
}
}
}
您可以将品牌建议的建议列表附加到产品建议的建议列表中,去除重复后,得到只有相关建议、没有重复的建议列表和产品建议。
另一种解决方案是使用提升品牌和产品的查询,而不是使用建议器。但是,此实现速度较慢,因为它不使用建议器。