Roy*_*itz 3 java elasticsearch kibana
我们使用的是 Elasticsearch 7.3.1 版和 Java API。
我们正在实施“免费搜索”,这意味着在 Elasticsearch 中每个段的所有字段中搜索一个值。如果该值出现在段的至少一个字段中,则应返回该值。
到目前为止,我们使用了以下内容:QueryBuilders.multiMatchQuery(value)并且效果很好。
至于今天,我们在映射文件中添加了一些嵌套(Elasticsearch 数据类型)类型的字段。
更改之后,上面的代码不再返回预期的结果。
如何在不指定要搜索的每个字段的情况下在段中的所有字段中实现搜索?
您可以实现 _all 以前的 elasticsearch 版本的逻辑(我相信这是在版本 6 之后删除的)。
PUT stackoverflow
{
"mappings": {
"properties": {
"all": {
"type": "text"
},
"group": {
"type": "text",
"copy_to": "all"
},
"user": {
"type": "nested",
"properties": {
"email": {
"type": "keyword",
"copy_to": "all"
},
"info": {
"type": "text",
"copy_to": "all"
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上你添加copy_to参数。
PUT stackoverflow/_doc/1
{
"group" : "programmers",
"user" : [
{
"email" : "test@gmail.com",
"info" : "java developer"
},
{
"email" : "demo@wikipedia.org",
"info" : "css guru"
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后你可以搜索该all字段
GET stackoverflow/_search
{
"query": {
"match": {
"all": "guru"
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新
下面是一个示例,说明如何修改您的查询以使其在没有 copy_to
GET stackoverflow/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"group"
]
}
},
{
"nested": {
"path": "user",
"query": {
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"user.email", "user.info"
]
}
}
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新 2
public static void main(String[] args) {
String queryInput = "QUERY_INPUT_HERE";
String[] nested = {"user", "product"};
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(queryInput, "*");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> shouldQueryBuilders = boolQueryBuilder.should();
shouldQueryBuilders.add(multiMatchQueryBuilder);
for(String path : nested) {
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery(path, multiMatchQueryBuilder, ScoreMode.Avg);
shouldQueryBuilders.add(nestedQueryBuilder);
}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
searchRequest.indices("MY_INDEX");
System.out.println(searchRequest.toString());
}
Run Code Online (Sandbox Code Playgroud)
输出
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
{
"nested": {
"query": {
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
"path": "user",
"ignore_unmapped": false,
"score_mode": "avg",
"boost": 1.0
}
},
{
"nested": {
"query": {
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
"path": "product",
"ignore_unmapped": false,
"score_mode": "avg",
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |