Java 弹簧数据+;Mongo案例不敏感文本搜索

Java 弹簧数据+;Mongo案例不敏感文本搜索,java,mongodb,spring-data,spring-data-mongodb,Java,Mongodb,Spring Data,Spring Data Mongodb,我试图使用spring数据存储库在mongodb中的几个字段上实现不区分大小写的文本搜索。我找到了两种解决方案,每种都有两个缺点: 使用正则表达式: @Query("{'status': 'ACTIVE', $or: [{'title': {$regex : ?0, $options: 'i'}}, {'location.text': {$regex : ?0, $options: 'i'}}]}") Page<Article> findAllActiveBySearchString

我试图使用spring数据存储库在mongodb中的几个字段上实现不区分大小写的文本搜索。我找到了两种解决方案,每种都有两个缺点:

  • 使用正则表达式:

    @Query("{'status': 'ACTIVE', $or: [{'title': {$regex : ?0, $options: 'i'}}, {'location.text': {$regex : ?0, $options: 'i'}}]}")
    Page<Article> findAllActiveBySearchString(String search, Pageable pageable);
    
    @Query(“{'status':'ACTIVE',$or:[{'title':{$regex:?0,$options:'i'}},{'location.text':{$regex:?0,$options:'i'}]}”)
    PageFindAllActiveBysearchString(字符串搜索,可分页);
    
  • 这样的查询在字符串“/”、“*”上失败,并返回“.”上的所有条目,因此我必须转义这些字符或以某种方式对其进行过滤,但我甚至不知道可能存在多少这样的查询。所以我的问题是如何100%确保查询执行搜索,将每个字符都视为普通字符而不是特殊字符

  • 使用$text index,这需要在之前创建该索引(这不是问题)。解决方案也有更好的性能,不是吗

    @Query("{'status': 'ACTIVE', $text: {$search: ?0}}")
    Page<Article> findAllActiveBySearchString(String search, Pageable pageable);
    
    @Query(“{'status':'ACTIVE',$text:{$search:?0}”)
    PageFindAllActiveBysearchString(字符串搜索,可分页);
    

  • 我想知道它不是不区分大小写的,所以我必须用小写数据创建一个特殊的字段并对它进行索引-这是实现我的目标的唯一方法,还是我错过了什么?MongoDb没有针对全文搜索进行优化,所以你必须应对这个限制或使用另一个搜索引擎,如elasticsearch或solr

    在内部,这些人正在做你正在做的事情。例如,使用不同的分析器,如小写、stopword过滤、词干分析或n-gram分析进行模糊搜索

    当您想要坚持使用MongoDb时,您必须自己编写和索引这些特性