Autocomplete 弹性搜索在数组字段上的自动完成搜索
我正在对具有字符串类型数组的文档字段进行自动完成建议。我的文件如下Autocomplete 弹性搜索在数组字段上的自动完成搜索,autocomplete,elasticsearch,faceted-search,Autocomplete,elasticsearch,Faceted Search,我正在对具有字符串类型数组的文档字段进行自动完成建议。我的文件如下 { "title": "Product1", "sales": "6", "rating": "0.0", "cost": "45.00", "tags": [ "blog", "magazine", "responsive", "two columns", "wordpress" ], "c
{
"title": "Product1",
"sales": "6",
"rating": "0.0",
"cost": "45.00",
"tags": [
"blog",
"magazine",
"responsive",
"two columns",
"wordpress"
],
"category": "wordpress",
"description": "Product1 Description",
"createDate": "2013-12-19"
}
{
"title": "Product1",
"sales": "6",
"rating": "0.0",
"cost": "45.00",
"tags": [
"blog",
"paypal",
"responsive",
"skrill",
"wordland"
],
"category": "wordpress",
"description": "Product1 Description",
"createDate": "2013-12-19"
}
我正在标记字段上执行自动完成搜索。我的疑问是
query: {
query_string: {
query: "word*",
fields: ["tags"]
}
},
facets: {
tags: {
terms: {
field: "tags"
}
}
}
当用户输入“word”时,我想显示“wordland”和“wordpress”。然而,我无法做到这一点
你能帮个忙吗
谢谢你试过了吗?解决问题的一种方法如下:
1) 创建索引:
curl -XPUT "http://localhost:9200/test_index/"
2) 使用完成建议器类型创建映射:
curl -XPUT "http://localhost:9200/test_index/product/_mapping" -d'
{
"product": {
"properties": {
"category": {
"type": "string"
},
"cost": {
"type": "string"
},
"createDate": {
"type": "date",
"format": "dateOptionalTime"
},
"description": {
"type": "string"
},
"rating": {
"type": "string"
},
"sales": {
"type": "string"
},
"tags": {
"type": "string"
},
"title": {
"type": "string"
},
"suggest": {
"type": "completion",
"index_analyzer": "simple",
"search_analyzer": "simple",
"payloads": false
}
}
}
}'
3) 添加您的文档:
curl -XPUT "http://localhost:9200/test_index/product/1" -d'
{
"title": "Product1",
"sales": "6",
"rating": "0.0",
"cost": "45.00",
"tags": [
"blog",
"magazine",
"responsive",
"two columns",
"wordpress"
],
"suggest": {
"input": [
"blog",
"magazine",
"responsive",
"two columns",
"wordpress"
]
},
"category": "wordpress",
"description": "Product1 Description",
"createDate": "2013-12-19"
}'
curl -XPUT "http://localhost:9200/test_index/product/2" -d'
{
"title": "Product2",
"sales": "6",
"rating": "0.0",
"cost": "45.00",
"tags": [
"blog",
"paypal",
"responsive",
"skrill",
"wordland"
],
"suggest": {
"input": [
"blog",
"paypal",
"responsive",
"skrill",
"wordland"
]
},
"category": "wordpress",
"description": "Product1 Description",
"createDate": "2013-12-19"
}'
4) 然后使用_suggest端点进行查询:
curl -XPOST "http://localhost:9200/test_index/_suggest" -d'
{
"product_suggest":{
"text":"word",
"completion": {
"field" : "suggest"
}
}
}'
您将得到您预期的结果:
{
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"product_suggest": [
{
"text": "word",
"offset": 0,
"length": 4,
"options": [
{
"text": "wordland",
"score": 1
},
{
"text": "wordpress",
"score": 1
}
]
}
]
}
当然,这个解决方案可以稍加改进,特别是通过删减一些重复数据,但这应该会为您指明正确的方向。谢谢您的回答,我会试试这个谢谢Sloan。这是有效的Gr8。是否有任何方法可以在预先存在的索引上实现这一点,而无需重新播种。您所描述的这种方法会导致重复数据,我不希望这样。是的,您可以使用ngrams。无论如何,我更喜欢那种方法。如果你再发一个问题,我会给你一个例子。这个解决方案在ES 5.3中对我不起作用。不再支持playload选项,输出包含完整文档,而不是匹配术语的标记