8

I have spring-data-mogodb application on java or kotlin, and need create text search request to mongodb by spring template.

In mongo shell it look like that:

  db.stores.find(
   { $text: { $search: "java coffee shop" } },
   { score: { $meta: "textScore" } }
  ).sort( { score: { $meta: "textScore" } } )

I already tried to do something but it is not exactly what i need:

@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
} 

May be someone already working with text searching on mongodb with java, please share your knowledge with us )

2
  • Can you tell exactly what you need? I can give you an example of my own using MongoRepository, MongoTemplate and optionally an Aggregation but I'd like to be sure that what you're looking for. Commented Jan 7, 2019 at 10:37
  • @charlycou i need to create an query with "Text Search" docs.mongodb.com/manual/text-search and sorting and this request should return to me collection of my object, not mongo Document Commented Jan 9, 2019 at 8:37

1 Answer 1

13

Setup Text indexes

First you need to set up text indexes on the fields on which you want to perform your text query.

If you are using Spring data mongo to insert your documents in your database, you can use @TextIndexed annotation and indexes will be built while inserting your document.

@Document
class MyObject{
  @TextIndexed(weight=3) String title;
  @TextIndexed String description;
}

If your document are already inserted in your database, you need to build your text indexes manually

TextIndexDefinition textIndex = new TextIndexDefinitionBuilder()
  .onField("title", 3)
  .onField("description")
  .build();

After the build and config of your mongoTemplate you can pass your text indexes/

template.indexOps(MyObject.class).ensureIndex(textIndex);

Building your text query

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
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.