Elasticsearch中的新search_as_you_type数据类型和标记器类型edge_ngram有什么区别?在构建即用型搜索引擎时更喜欢哪一个?
Elasticsearch的文档提供了两种实现:
search\u as\u you\u type数据类型:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-as-you-type.html
标记器类型edge\U ngram:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html(请看如何在键入时设置搜索字段的示例。)
更新
Elasticsearch版本:7.6.1
我索引我的数据与数据类型search_as_you_type根据最新的Elasticsearch留档,并试图建立一个简单的查询通过JavaAPI基于下面的例子:
GET my_index/_search
{
"query": {
"multi_match": {
"query": "brown f",
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram"
]
}
}
}
我要解决的问题是添加“type”:“bool\u prefix”。
A) 我试用了MultiMatchQueryBuilder
MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type(MatchQuery.Type.BOOLEAN_PREFIX);
在上述代码的第二行出现异常:
org.elasticsearch.ElasticsearchParseException: failed to parse [multi_match] query type [boolean_prefix]. unknown type.
B) 然后我尝试了MatchBoolPrefixQueryBuilder
MatchBoolPrefixQueryBuilder matchBoolPrefixQueryBuilder=new MatchBoolPrefixQueryBuilder(value, fields);
得到了一个例外
org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=parsing_exception, reason=[match_bool_prefix] unknown token [START_ARRAY] after [query]]
...
Suppressed: org.elasticsearch.client.ResponseException: method [POST], host [http://localhost:9200], URI [/my_dictionary/_search?pre_filter_shard_size=128&typed_keys=true&max_concurrent_shard_requests=5&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&ignore_throttled=true&search_type=query_then_fetch&batched_reduce_size=512&ccs_minimize_roundtrips=true], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"parsing_exception","reason":"[match_bool_prefix] unknown token [START_ARRAY] after [query]","line":1,"col":57}],"type":"parsing_exception","reason":"[match_bool_prefix] unknown token [START_ARRAY] after [query]","line":1,"col":57},"status":400}
at线路
SearchResponse searchResponse=restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
我做错了什么?我应该使用哪一种?如何使用?
解决方案
我只需将类型更改为:
MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type("bool_prefix");
但是我不明白为什么类型必须硬编码为"bool_prefix"
而不是使用MatchQuery。键入。BOOLEAN_PREFIX
或者为什么不能使用MatchBoolPrefix QueryBuilder
,这个查询没有太多的实现示例。
两者是不同的东西。
edge_ngram是一个标记器,这意味着它在索引时启动,对输入数据进行标记。还有一个令牌过滤器。两者都很相似,但工作水平不同。查看此线程以了解主要区别。
search\u as\u you\u type是一种字段类型,它包含几个子字段,其中一个子字段称为索引前缀,并利用了边缘ngram标记器。
因此,基本上,当他们决定添加新的搜索类型as\u you\u type时,实际上已经利用了您在边缘标记器文档中看到的内容。
更新
你实际上需要用
MultiMatchQueryBuilder multiMatchQueryBuilder=new MultiMatchQueryBuilder(value, fields);
multiMatchQueryBuilder.type(MultiMatchQueryBuilder.Type.BOOL_PREFIX);
您可以在这里看到枚举值是如何构建的