【问题标题】:ElasticsearchRepository findBy query is returning null when parameter has special characters in it当参数中包含特殊字符时,ElasticsearchRepository findBy 查询返回 null
【发布时间】:2020-07-06 08:09:55
【问题描述】:

我有一个带有以下文档架构的 ES 集合。

public class Address {

    @Id
    private String id;
    private String name;
    private String type;
    private String city;
}

我的仓库如下所示:

public interface NetworkElementsESRepository extends ElasticsearchRepository<Address, String> {
     Address findByNameAndCity(String name, String city);
}

当我运行查询 addressRepo.findByNameAndCity(Name,City) 时,当 name 参数具有特殊字符(例如 B00/A3K/24)时它返回 null,但返回结果正常当 Name 没有特殊字符时。

我已经通过 Spring Boot 浏览了 ElasticSearch 和 ES 使用的整个文档,但都是徒劳的。我没有得到确切的错误,因为查询没有运行。

【问题讨论】:

    标签: java spring-boot elasticsearch spring-data-jpa elasticsearch-query


    【解决方案1】:

    发生这种情况是因为您可能将 Elasticsearch text 字段用于您的 name 字段,该字段使用 standard analyzer 并在您的情况下删除了像 / 这样的特殊字符,如下面的示例所示。然后使用 [term][1] 查询或其他不会删除查询中的 / 字符的查询。

    分析 API

    {
        "text": "B00/A3K/24",
        "analyzer" : "standard"
    }
    

    生成的令牌

    {
        "tokens": [
            {
                "token": "b00",
                "start_offset": 0,
                "end_offset": 3,
                "type": "<ALPHANUM>",
                "position": 0
            },
            {
                "token": "a3k",
                "start_offset": 4,
                "end_offset": 7,
                "type": "<ALPHANUM>",
                "position": 1
            },
            {
                "token": "24",
                "start_offset": 8,
                "end_offset": 10,
                "type": "<NUM>",
                "position": 2
            }
        ]
    }
    

    以上信息基于您提供的任何信息,如果您可以提供 JSON 格式的索引映射和搜索查询,我可以确认或告诉您确切原因。

    【讨论】:

    • 感谢您的及时回复。由于我是 ES 新手,如果这个来自 Spring 数据的 ElasticsearchRepository 默认使用标准分析器,我仍然感到困惑?如果是,那么我需要为此编写客户分析器吗?
    • @akshit,是的,spring 数据将使用 Elastic 中定义的相同数据,这是标准的,是的,在这种情况下,您需要使用自定义分析器,我可以帮助您,但是请将其作为一个单独的问题提出并标记此答案,如果对您有帮助,请点赞
    • 谢谢。仅供参考,我的 json 查询需要看起来像这样 { "query" : { "bool" : { "must" : [ { "query_string" : { "query" : "?", "fields" : [ "name" ] } }, { "query_string" : { "query" : "?", "fields" : [ "city" ] } } ] } }}
    • @akshit,您使用的是不推荐的查询字符串,而应该使用布尔查询,但请不要在这里混淆,因为这对社区没有帮助,你能请提出一个单独的问题,并按照建议将其标记为答案并在评论中 ping 您的新问题链接,我会看看
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2020-04-26
    • 2016-12-08
    • 2011-02-19
    • 2017-11-02
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多