Atlas Search
Configure o operador de busca do Atlas, composto/filter, score, highlight, token de sequência, paginação/count com base na versão 1.0.0.
Busca básica do Atlas
Flux<Article> results = dsl
.executeEntity(Article.class, MongoTemplateName.FRONT)
.search("articles_default")
.text(text -> text
.path("title")
.query("reactive mongo dsl")
)
.findAll()
.execute();$search e $searchMeta devem ser o primeiro estágio do pipeline de agregação, portanto, estão separados do fluxo comum fields(...).end(). Você também pode usar .search() sem o índice.
Operador de busca
• construtor raiz: text, phrase, autocomplete, equals, exists, in, range, compound
• cláusula reutilizável: SearchOperators.text/phrase/autocomplete/equals/in/exists/range
• operador raiz nativo do driver: operator(SearchOperator)
• wrapper nomeado do Driver: SearchOperators.driver(name, operator)
.search("articles_default")
.compound(compound -> compound
.mustText("title", text -> text.query("mongodb"))
.shouldText("summary", text -> text.query("mongodb"))
.filterEquals("status", eq -> eq.value("PUBLISHED"))
.mustNotExists("deletedAt")
.minimumShouldMatch(0)
)
.findAll()
.execute();compound suporta must, mustNot, should, filter, minimumShouldMatch, score e você também pode passar um AtlasSearchOperator diretamente.
Texto / Frase / Autocomplete
.text(text -> text
.paths("title", "summary")
.query("reactive mongo dsl")
.matchCriteria(SearchMatchCriteria.ALL)
.fuzzy(1, 1, 50)
.score(SearchScoreSpec.boost(3.0))
)• text: caminho(s), consulta(s), fuzzy, matchCriteria, sinônimos, score
• phrase: caminho(s), consulta(s), slop, sinônimos, score
• autocomplete: caminho único, consulta(s), tokenOrder, fuzzy, score
• fuzzy(...) e synonyms(...) não são usados simultaneamente.
Diferença entre cláusula de busca e campos pós-busca.
.search("articles_default")
.text(text -> text.path("title").query("mongodb"))
.fields(
pair("deleted", false),
pair("status", "PUBLISHED")
)
.findAll()
.execute();search().fields(...) não é um filtro interno do $search, mas um $match comum após o $search. Para restringir candidatos na etapa do índice de busca, use compound.filter(...).
$search
-> stage(Bson) if configured
-> $match (fields)
-> metadata addFields / score match
-> paging
-> projectionScore e ordenação
.search("articles_default")
.text(text -> text.path("title").query("mongodb"))
.addFieldsScore("searchScore")
.matchScoreGte(1.5)
.scoreDesc()
.sorts(sort -> sort.desc("publishedAt").desc("id"))
.findAll()
.execute();scoreDesc()/scoreAsc() e ordenação comum têm prioridade definida pela ordem de chamada. Para uma paginação estável, é recomendável ter uma ordenação de campo único estável junto com o score.
Destaque / detalhes do score / token de sequência
.search("articles_default")
.text(text -> text.path("title").query("mongodb"))
.highlight(highlight -> highlight
.path("title")
.maxCharsToExamine(100_000)
.maxNumPassages(3)
)
.addFieldsHighlights()
.addFieldsScoreDetails()
.addFieldsSequenceToken()
.findAll()
.execute();Os aliases padrão são highlights, scoreDetails, searchSequenceToken. addFieldsScoreDetails() também ativa os detalhes de pontuação da opção de pesquisa.
Paginação / token de sequência / contagem
Mono<PageResult<Article>> page = dsl
.executeEntity(Article.class, key)
.search("articles_default")
.text(text -> text.path("title").query("mongodb"))
.paging(0, 20)
.findAll()
.executePage();
// sequence token
.searchAfter(token)
// or
.searchBefore(token)count().execute()
Contagem final do pipeline refletindo post-search fields(...) e o limite de pontuação.
count().executeSearchMeta()
Contagem de metadados $searchMeta. Suporta SearchCountType.TOTAL/LOWER_BOUND e não executa $match pós-pesquisa.
existsQuery().execute()
Verifica se há mais de um resultado no pipeline de pesquisa.
Extensão nativa do Driver
.search("search-index")
.operator(driverSearchOperator)
.driverOptions(options -> options.option("someNewOption", value))
.stage(Aggregates.score("$rating"))
.findAll()
.execute();stage(Bson) é inserido logo após $search e não se aplica ao pipeline de contagem de metadados $searchMeta de executeSearchMeta(). Se novos recursos do Driver forem adicionados antes da API de conveniência DSL, use operator, driverOptions, stage, SortSpec.driver, customizeAggregation primeiro.