在不修改索引映射的情况下在 ES 中搜索带有 space 的单词

Search a Word with space in ES without modifying index mapping

我正在使用 spring 引导版本 2.3.9 Release 并且 ES 是 7.6.How 在不修改索引映射的情况下在 ES 中搜索带有 space 的单词。 例如姓名:John Jose 我正在尝试使用以下代码,但无法正常工作。我读了一些其他 post,我们需要添加 'Not analyser'。我不需要修改索引映射。是否可以在查询生成器本身中添加此检查。

QueryBuilder testQuery = QueryBuilders.matchQuery("cname","John Jose");

索引映射

"cname": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}

text 字段被分析,默认情况下使用 standard 分析器,因此在您的情况下,您的 John Jose 将创建标记为 johnjose(也请注意小写字母),以及 match 查询的搜索时间,它将使用相同的分析器进行标记化,因此如果您的索引文档具有 John Jose 之类的内容,它将匹配.. 您无需做任何事情。

它不起作用,因为您正在尝试 Match Query。默认匹配查询集运算符为 OR.

因此对于您的代码,它会在内部创建类似 John OR Jose 和 return 结果的查询。

如果您希望这两个词都出现在名称中的任何位置,那么您可以尝试设置默认运算符值 AND,如下所示。这将创建类似 John AND Jose

的查询
QueryBuilder testQuery = QueryBuilders.matchQuery("cname","John Jose").operator(Operator.AND);

如果你想做 phrase match(execat 匹配),那么你可以尝试下面的查询,它将在内部执行类似 "John Jose" 的查询(根据我的理解,你正在寻找这个查询)

QueryBuilder testQuery = QueryBuilders.matchPhraseQuery("cname","John Jose");