我尝试使用spring数据库在mongodb中的几个字段上实现不区分大小写的文本搜索。我找到了两个解决方案,每个解决方案都有一些缺点:
使用正则表达式:
@Query("{'status': 'ACTIVE', $or: [{'title': {$regex : ?0, $options: 'i'}}, {'location.text': {$regex : ?0, $options: 'i'}}]}")
Page<Article> findAllActiveBySearchString(String search, Pageable pageable);
这样的查询在字符串&#34; /&#34;,&#34; *&#34;上失败,并返回&#34;。&#34;上的所有条目,所以我必须逃避theese字符或以某种方式过滤它,但我甚至不知道可能存在多少这样的查询。所以我的问题是如何100%确保查询执行搜索,将每个字符视为普通字符。
使用$ text索引,需要先创建该索引(不是问题)。解决方案也有更好的性能,不是吗?
@Query("{'status': 'ACTIVE', $text: {$search: ?0}}")
Page<Article> findAllActiveBySearchString(String search, Pageable pageable);
我不知道它不是不区分大小写的,所以我必须用小写数据创建特殊字段并将其编入索引 - 是实现目标的唯一途径,还是我错过了什么?
答案 0 :(得分:0)
MongoDb未针对全文搜索进行优化,因此您必须应对此限制或使用其他搜索引擎,例如elasticsearch或solr。
在内部,你正在做同样的事情。例如,使用不同的分析器,如小写,停用词过滤,词干或n-gram分析进行模糊搜索。
如果你想坚持使用MongoDb,你必须自己编写和索引这些功能。