在Elasticsearch中查询以特定单词开头的字符串

我想在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

字段,一种用于标准搜索操作,另一种用于获取以特定单词开头的字符串。我这样创建了样本索引。 仅索引字符串的第一个标记。

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

}

}

}

在查询中使用 。

希望能帮助到你!

以上是 在Elasticsearch中查询以特定单词开头的字符串 的全部内容, 来源链接: utcz.com/qa/435719.html

回到顶部