在不修改索引映射的情况下在 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
将创建标记为 john
和 jose
(也请注意小写字母),以及 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");
我正在使用 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
将创建标记为 john
和 jose
(也请注意小写字母),以及 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");