在这种特殊情况下,限制令牌过滤器将非常有用。您可以通过两种不同的方法来分析 character_name
字段,一种用于标准搜索操作,另一种用于获取以特定单词开头的字符串。我这样创建了样本索引。 only_first 仅索引字符串的第一个标记。
PUT character{ "settings": { "analysis": { "analyzer": { "character_analyzer": { "tokenizer": "whitespace", "filter": [ "lowercase", "one_token_limit" ] } }, "filter": { "one_token_limit": { "type": "limit", "max_token_count": 1 } } } }, "mappings": { "mytype": { "properties": { "character_name": { "type": "string", "fields": { "only_first": { "type": "string", "analyzer": "character_analyzer" } } } } } }}然后像这样查询 only_first 字段
{ "query": { "query_string": { "fields": ["character_name.only_first"], "query": "Donald" } }}这将为您提供所需的结果。我已经使用了空白标记器,但是如果要匹配“唐纳德·唐纳德鸭”,也可以使用标准标记器。
另一种方法是跨度优先查询,但是问题是,
term query这样“唐纳德”将匹配但“唐纳德”将不匹配
{ "span_first" : { "match" : { "span_term" : { "character_name" : "donald" } }, "end" : 1 }}但是“唐纳德”将为您提供零结果( 区分大小写 ),但是第一种方法肯定会起作用。
编辑1 :前缀匹配
您可以像这样先在范围内包装前缀查询
{ "query": { "span_first": { "match": { "span_multi": { "match": { "prefix": { "character_name": { "value": "don" } } } } }, "end": 1 } }}不要 在查询中使用 “ *” 。
希望能帮助到你!



