当前位置: 首页 > 面试题库 >

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

荆树
2023-03-14
问题内容

我想在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这样“唐纳德”将匹配但“唐纳德”将不匹配

{
    "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
    }
  }
}

不要 在查询中使用 “ *”

希望能帮助到你!



 类似资料:
  • 我得到以下字符串: 我想从里面拿走食物和饮料。 我尝试了以下代码: 但它给人的感觉是,食物很刺激,喝了很多,离食物很近,三个和四个。

  • 这是我的浏览方法。我正在尝试通过“dictionaryEntry”对象的哈希图进行搜索,只查看条目的“word”部分。(b.word)。这个想法是您可以搜索整个字典并返回所有以给定方法的字符串开头的单词。例如,您可以返回所有以字符串“sto”开头的单词。我的想法是遍历哈希图,如果单词的子字符串,从位置零开始并以输入字符串的长度结束,它将被添加到数组列表中。然后将返回数组列表。

  • 我被分配了一个任务,从数组列表中返回以特定字母开头的单词,但是我选择了字母c;我被告知我可以用另一种方式做到这一点,除了专门返回每个以字母开头的元素和许多println之外,我不知道除了使用ArrayList startswith方法之外,还有什么其他方法可以做到这一点,有人愿意启发我吗? }

  • 我正在使用jsTree,到目前为止看起来还不错。 我有一个节点列表,它的id随着每一个新节点而增加,比如(g1,g2,g3……和一些其他节点,比如k1,k2,k3) 我可以通过使用 但是我想打开所有以'g'开头而不是'k'开头的节点,是不是可以使用$(id^=g)之类的东西? 更新: 这些节点是通过Web服务(如 从Web服务返回的数据被分配给jstree,因此我只需要打开id以'g'开头而不是'

  • 我想知道如何检查文件是否存在: 例如,我有很多文件: 如何检查以Bob开头的文件是否存在?

  • 问题内容: 查询条件应支持布尔运算符和正则表达式。我已经读过关于Booleano的文章,但是它不支持正则表达式。 如果没有满足此要求的东西,那将是开始构建的最佳技术? 以下示例中的语法只是一个示例,但是它提供的功能应该存在。 等于 适用于以下清单 问题答案: 我设法使用pyparsing模块解决了这个问题。 为了避免发生冲突,我必须用<>替换regexp(),但是目前所有这些似乎都是最好的解决方案