我想在elasticsearch中编写一个查询,这样它只会给出字符串从特定单词开始的结果,例如,如果我要搜索“ Donald”,则我现在有一个字符串“ Donald Duck”,而另一个字符串是“ Alan Donald” “与以下查询
"query": { query_string: { query: "Donald", fields: ['character_name'] } }
那么结果应该是“ Donald Duck”而不是“ Alan Donald”,因为在“ Donald Duck”中,它以“ Donald”开头。现在有人可以告诉我如何写这样的查询吗,我搜索了很多帖子,但没有找到任何解决方案。
编辑1
我的映射如下
"settings": { "index": { "analysis": { "analyzer": { "simple_wildcard": { "tokenizer": "whitespace", "filter": ["lowercase"] } } } } }, "mappings" : { "college": { "properties":{ "character_name" : { "type" : "string", "index": "analyzed", "analyzer": "simple_wildcard"} } } }
在这种特殊情况下,限制令牌过滤器将非常有用。您可以通过两种不同的方法来分析 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这样“唐纳德”将匹配但“唐纳德”将不匹配
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 } } }
不要 在查询中使用 “ *” 。
希望能帮助到你!