我在Java或Kotlin上都有spring-data-mogodb应用程序,并且需要通过spring模板向mongodb创建文本搜索请求。
在mongo shell中,它看起来像这样:
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
我已经尝试做某事,但这并不是我真正需要的:
@override fun getSearchedFiles(searchQuery: String, pageNumber: Long, pageSize: Long, direction: Sort.Direction, sortColumn: String): MutableList<SystemFile> {
val matching = TextCriteria.forDefaultLanguage().matching(searchQuery)
val match = MatchOperation(matching)
val sort = SortOperation(Sort(direction, sortColumn))
val skip = SkipOperation((pageNumber * pageSize))
val limit = LimitOperation(pageSize)
val aggregation = Aggregation
.newAggregation(match, skip, limit)
.withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build())
val mappedResults = template.aggregate(aggregation, "files", SystemFile::class.java).mappedResults
return mappedResults
}
可能是已经使用Java在mongodb上进行文本搜索的人,请与我们分享您的知识)
答案 0 :(得分:1)
首先,您需要在要执行文本查询的字段上设置文本索引。
如果您正在使用Spring data mongo将文档插入数据库中,则可以使用@TextIndexed
批注,并且在插入文档时将建立索引。
@Document
class MyObject{
@TextIndexed(weight=3) String title;
@TextIndexed String description;
}
如果您的文档已经插入数据库中,则需要手动构建文本索引
TextIndexDefinition textIndex = new TextIndexDefinitionBuilder()
.onField("title", 3)
.onField("description")
.build();
the build and config of your mongoTemplate之后,您可以传递文本索引/
template.indexOps(MyObject.class).ensureIndex(textIndex);
List<MyObject> getSearchedFiles(String textQuery){
TextQuery textQuery = TextQuery.queryText(new TextCriteria().matchingAny(textQuery)).sortByScore();
List<MyObject> result = mongoTemplate.find(textQuery, MyObject.class, "myCollection");
return result
}