我想在elasticsearch中编写一个查询,这样它只会给出字符串从特定单词开始的结果,例如我有一个字符串“Donald Duck”,另一个字符串是“Alan Donald”,如果我将搜索对于具有以下查询的“唐纳德”
"query": {
query_string: {
query: "Donald",
fields: ['character_name']
}
}
然后结果应该是“唐老鸭”不是“艾伦唐纳德”,因为在“唐老鸭”中它以“唐纳德”开头。现在任何人都可以告诉我如何编写这样的查询,我搜索了很多帖子但没有找到任何解决方案。
Edit-1
我的映射在下面给出
"settings": {
"index": {
"analysis": {
"analyzer": {
"simple_wildcard": {
"tokenizer": "whitespace",
"filter": ["lowercase"]
}
}
}
}
},
"mappings" : {
"college": {
"properties":{
"character_name" : { "type" : "string", "index": "analyzed", "analyzer": "simple_wildcard"}
}
}
}
答案 0 :(得分:1)
Limit Token filter会非常有帮助。您可以通过两种不同的方式分析 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"
}
}
}
这将为您提供所需的结果。我使用了whitespace标记器,但是如果你想匹配" donald-donald duck"你也可以使用标准标记器。
另一种方式是span first query但问题是它是term query
所以' donald'会匹配,但唐纳德'不匹配
{
"span_first" : {
"match" : {
"span_term" : { "character_name" : "donald" }
},
"end" : 1
}
}
但是唐纳德'将给你零结果(区分大小写),但第一种方法肯定会有用。
编辑1 :前缀匹配
您可以像这样
首先在span内包装前缀查询{
"query": {
"span_first": {
"match": {
"span_multi": {
"match": {
"prefix": {
"character_name": {
"value": "don"
}
}
}
}
},
"end": 1
}
}
}
请在查询中使用" *" 。
希望它有所帮助!