Spring 数据 api(包含或开头)不适用于具有通配符的 SPACE

Spring Data api (Containing or startwith) not working with SPACE which has wildcard

我正在使用 Elastic Search 和 Spring 数据。

我在存储库中有一个简单的方法:

findByUserNameContaining("a b");

由于 SPACE.

,此方法未给出预期结果

获取错误:

"Cannot constructQuery '"a b"'. Use expression or multiple clauses instead." EXCEPTION="org.springframework.dao.InvalidDataAccessApiUsageException: Cannot constructQuery '"a b"'. Use expression or multiple clauses instead.

由于 Space 而停止创建多个令牌。 我有映射:

"userName": {
    "type": "string",
    "index": "not_analyzed"
},

我很惊讶在映射 "index": "not_analyzed" 之后遇到这个问题。

请帮助我。 提前致谢!

实际上 Spring 数据 apis(包含或 startWith)不适用于 String 中的 space。我已经用 Elastic core 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 + "*"));