当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:search\u as\u you\u type datatype vs.tokenizer edge\u ngram

邢烨烨
2023-03-14

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,这个查询没有太多的实现示例。

共有1个答案

养研
2023-03-14

两者是不同的东西。

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);

您可以在这里看到枚举值是如何构建的

 类似资料:

相关问答

相关文章

相关阅读