弹性搜索在数组字段上自动完成搜索 [英] Elasticsearch autocomplete search on array field
问题描述
我正在处理具有数组类型字符串的文档字段上的自动填充建议。我的文件如下:
I am working on autocomplete suggestion on document field that has array of type string. My document is like below;
{
"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"
}
我正在标签字段执行自动填充搜索。我的查询就像;
I am performing autocomplete search on tags field. My query is like;
query: {
query_string: {
query: "word*",
fields: ["tags"]
}
},
facets: {
tags: {
terms: {
field: "tags"
}
}
}
当用户键入单词我想显示wordland和wordpress。但是,我无法做到这一点。
When user type "word" I want to display "wordland" and "wordpress". However, I couldn't manage to do that.
你可以帮忙吗?
谢谢
推荐答案
你尝试过完成建议?解决问题的一种方法如下:
Have you tried completion suggest? One way to solve your problem is as follows:
1)创建索引:
curl -XPUT "http://localhost:9200/test_index/"
2 )创建映射,使用完成建议类型:
2) Create the mapping, using the completion suggester type:
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端点进行查询:
4) And then query using the _suggest endpoint:
curl -XPOST "http://localhost:9200/test_index/_suggest" -d'
{
"product_suggest":{
"text":"word",
"completion": {
"field" : "suggest"
}
}
}'
,您将获得预期的结果:
and you will get the results back that you expected:
{
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"product_suggest": [
{
"text": "word",
"offset": 0,
"length": 4,
"options": [
{
"text": "wordland",
"score": 1
},
{
"text": "wordpress",
"score": 1
}
]
}
]
}
这个解决方案可以改进一点,当然,特别是修剪一些重复的数据,但这应该指向正确的方向。
This solution could be refined a bit, of course, particularly by pruning some duplicate data, but this should point you in the right direction.
这篇关于弹性搜索在数组字段上自动完成搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!