Как создать полнотекстовый поисковый запрос в mongodb с помощью spring-data? - PullRequest
0 голосов
/ 07 января 2019

У меня есть приложение spring-data-mogodb на java или kotlin, и мне нужно создать запрос текстового поиска для mongodb по шаблону spring.

В оболочке Монго это выглядит так:

  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
} 

Может быть, кто-то уже работает с поиском текста на mongodb с помощью Java, пожалуйста, поделитесь с нами своими знаниями)

1 Ответ

0 голосов
/ 09 января 2019

Настройка текстовых индексов

Сначала необходимо настроить текстовые индексы для полей, в которых вы хотите выполнить текстовый запрос.

Если вы используете 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();

После сборки и конфигурации вашего 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
}
...