elasticsearch ElasticSearch 7.6.3 Java高级Rest客户端:跨多个字段自动建议-如何实现
我们有一个包含以下字段的索引,并且需要通过搜索索引中所有文本和关键字映射字段的数据向用户提供自动建议elasticsearch ElasticSearch 7.6.3 Java高级Rest客户端:跨多个字段自动建议-如何实现,elasticsearch,autocomplete,resthighlevelclient,elasticsearch,Autocomplete,Resthighlevelclient,我们有一个包含以下字段的索引,并且需要通过搜索索引中所有文本和关键字映射字段的数据向用户提供自动建议 { "settings": { "number_of_shards": 1, "number_of_replicas": 1, "analysis": { "filter": { "autocomplete_filter": { "type": "edge_ngram", "min_gram": 1,
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
}
},
"mappings": {
"properties": {
"id": {
"type": "text"
},
"title": {
"type": "text"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
},
"subject": {
"type": "text"
},
"title_suggest": {
"type": "completion",
"analyzer": "simple",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"subject_suggest": {
"type": "completion",
"analyzer": "simple",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}
"fieldOr": {
"type": "text"
},
"fieldsTa": {
"type": "text"
},
"notes": {
"type": "text"
},
"fileDocs": {
"type": "nested",
"properties": {
"fileName": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"fileContent": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"docType": {
"type": "keyword"
},
"opinionId": {
"type": "integer"
}
}
},
"fileMeta": {
"type": "nested",
"properties": {
"url": {
"type": "text"
},
"name": {
"type": "text"
}
}
}
}
}
}
我尝试了完成建议,但它与1个领域的作品。我已经在索引中创建了两个带*建议的字段,并尝试使用completionSuggest创建建议
SuggestBuilders.completionSuggestion("my_index_suggest").text(input);
但它只支持1个字段。我正在使用ES7.6.3和Java高级Rest客户端,它适用于1个字段。我需要做哪些更改来支持多个字段。这可以通过JSON搜索实现吗?如果是,那么我可以使用Xcontentbuilder创建json并执行自动建议?使用并将所有所需字段复制到一个字段,并在其上执行建议
复制到is的文档中的示例
PUT my_index
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
使用并将所有所需字段复制到一个字段,并在其上执行建议
复制到is的文档中的示例
PUT my_index
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
为了便于说明,我使用了我自己的索引映射,它只有两个字段name和address,我将在这两个字段上进行自动完成查询,您可以类似地包含更多字段 索引映射 使用Rest高级客户端搜索查询 对于本例,生成搜索JSON
为了便于说明,我使用了我自己的索引映射,它只有两个字段name和address,我将在这两个字段上进行自动完成查询,您可以类似地包含更多字段 索引映射 使用Rest高级客户端搜索查询 对于本例,生成搜索JSON
如果你不被限制只使用ES完成建议器,那么我可以告诉你多种方法,lmk如果你是intestedHI Opster ES Ninja,请你建议其他可能的方法,以便我也可以尝试它们。我们正在使用带角度前端的Spring Boot,如果您看到索引用户可以上传docx、pdf等文件,我们可能还需要根据文件内容自动建议。我们目前正在使用Tika parser获取内容并保存在fileContent字段下的索引中。添加了我的答案,请查看并告知我是否需要任何澄清,也请阅读我在autocomplete上的博客,以及我为什么在您的案例中使用前缀查询来实现它。您很久没有对我的答案进行投票,如果你的问题得到解决,如果你能对答案进行投票,那就太好了。如果你不局限于使用ES完成建议器,那么,我可以告诉你多种方法,lmk如果你是intestedHI Opster ES Ninja,请你建议其他可能的方法,以便我也可以尝试它们。我们正在使用带角度前端的Spring Boot,如果您看到索引用户可以上传docx、pdf等文件,我们可能还需要根据文件内容自动建议。我们目前正在使用Tika parser获取内容并保存在fileContent字段下的索引中。添加了我的答案,请查看并告知我是否需要任何澄清,也请阅读我在autocomplete上的博客,以及我为什么在您的案例中使用前缀查询来实现它。您很久没有对我的答案进行投票,如果你的问题得到解决,如果你能投票决定答案那就太好了,如果您观察索引,我们将使用名为Filecontent的字段,其中Angular FE上传文档的内容将使用Tika解析器进行解析和存储。如果我使用copy_选项,它将创建一个巨大的字段,您认为我们可以使用此合并字段执行有效的自动建议。用户可以上传多个文件,如docx/pdf艾奇·温尼达普,如果您观察索引,我们将使用名为Filecontent的字段,其中Angular FE上传文档的内容将使用Tika解析器进行解析和存储。如果我使用copy_选项,它将创建一个巨大的字段,您认为我们可以使用此合并字段执行有效的自动建议。用户可以上传多个文件,如docx/pdfetcI已将@WinnieDaPooh标记为答案,因为我在索引中使用了副本。我还使用了Opster Elasticsearch Ninja suggestion,创建了boolquery,并进行了一些修改,以获得与我的自动建议完全匹配的结果,这样用户就不会得到不必要的搜索响应。多亏了bot,它现在可以工作了:我已经将@WinnieDaPooh标记为答案,因为我已经在索引中使用了副本。我还使用了Opster Elasticsearch Ninja suggestion,创建了boolquery,并进行了一些修改,以获得与我的自动建议完全匹配的结果,这样用户就不会得到不必要的搜索响应。感谢bot现在的工作:
public SearchResponse autosuggestSearch() throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder qb = QueryBuilders.boolQuery();
PrefixQueryBuilder namePQBuilder = QueryBuilders.prefixQuery("address", "usa");
PrefixQueryBuilder addressPQBuilder = QueryBuilders.prefixQuery("address", "usa");
qb.should(namePQBuilder);
qb.should(addressPQBuilder); //Similarly add more fields prefix queries.
sourceBuilder.query(qb);
SearchRequest searchRequest = new SearchRequest("employee").source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("Search JSON query \n" + searchRequest.source().toString()); //Generated ES search JSON.
return searchResponse;
}
{
"query": {
"bool": {
"should": [
{
"prefix": {
"address": {
"value": "usa",
"boost": 1.0
}
}
},
{
"prefix": {
"address": {
"value": "usa",
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
}
}
}