在这种特殊情况下,限制令牌过滤器将非常有用。您可以通过两种不同的方法来分析 character_name 字段,一种用于标准搜索操作,另一种用于获取以特定单词开头的字符串。我这样创建了样本索引。 仅索引字符串的第一个标记。
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
}
}
但是“唐纳德”将为您提供零结果( ),但是第一种方法肯定会起作用。
:前缀匹配
您可以像这样先在范围内包装前缀查询
{
"query": {
"span_first": {
"match": {
"span_multi": {
"match": {
"prefix": {
"character_name": {
"value": "don"
}
}
}
}
},
"end": 1
}
}
}
在查询中使用 。
希望能帮助到你!