我正在使用带有Spring Data的弹性搜索。
我在存储库中有一个简单的方法:
findByUserNameContaining("a b");
由于空间,此方法未给出预期结果。
获取错误:
"无法构造查询 ''a b''。请改用表达式或多个子句。EXCEPTION="org.springframework.dao.InvalidDataAccessApiUsageException: 无法构造查询 '"a b">'.请改用表达式或多个子句。
用于由于空间而停止创建多个令牌。我有映射:
"userName": {
"type": "string",
"index": "not_analyzed"
},
我非常惊讶我在"index": "not_analyzed"
映射后遇到了这个问题。
请帮助我。提前感谢!
实际上 Spring 数据 apis(包含或开始(不适用于字符串中的空格。我已经用弹性核心 API 实现了相同的内容。
NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type);
final BoolQueryBuilder aQuery = new BoolQueryBuilder();
aQuery.must(QueryBuilders.queryStringQuery("a b").defaultField("UserName"));
NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build();
List<Object> aDatas = elasticsearchTemplate.queryForList(nativeSearchQuery, Object.class);
你必须屏蔽空格:
findByUserNameContaining("a\ b");
就我而言,我只需要对字符串进行 url 编码,因此在搜索"a b"时只需对其进行编码,使其变为"a%20b",然后将构建查询。
我正在使用最新的 springboot 版本 2.3.*
这可以使用标准 API 中的表达式方法实现
在搜索文本周围加上引号表示完全匹配
criteria.and(new Criteria("FieldName").expression(""" + SEARCH_TEXT_WITH_SPACE + """));
通配符匹配的搜索文本两边带有星号
criteria.and(new Criteria("FieldName").expression("*" + SEARCH_TEXT_WITH_SPACE + "*"));