Я использую версиюasticsearch 6.8 для индексации документов, и у меня есть это требование при поиске. Я создал индекс со следующими настройками.
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2,
"analysis": {
"analyzer": {
"default": {
"type": "custom",
"tokenizer": "icu_tokenizer"
}
}
}
},
"mappings": {
"person": {
"properties": {
"firstName": {
"type": "text"
},
"lastName": {
"type": "text"
},
"technologies": {
"type": "nested"
}
}
}
}
}
Например, я создаю 3 документа с использованием следующих технологий.
- 1-й документ - "технологии": ["my технология испытаний "]
- 2-й документ -" технологии ": [" технологии испытаний "]
- 3-й документ" технологии ": [" технические испытания "]
Поэтому при поиске по ключевому слову «test» возвращаются все документы, это правильное поведение, но я хочу, чтобы второй документ получил приоритет, поскольку он начинается с test *. Поэтому мое требование состоит в том, чтобы начать со значениями приоритета, как показано ниже.
Результаты поиска должны быть:
- 1-й результат - 2-й документ - "технологии": ["технология тестирования"] Другие могут быть в любом порядке
- 1-й документ - "технологии": ["моя технология тестирования"]
- 3-й документ "технологии": ["технический тест"]
Вот мой java код для поиска. Я использую библиотекуasticsearch-rest-high-level-client.
SearchRequest searchRequest = new SearchRequest ("profile1"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder ();
QueryBuilder queryBuilder = QueryBuilders
.boolQuery()
.must(QueryBuilders
.matchQuery("technologies.name", technology));
searchSourceBuilder.query(QueryBuilders
.nestedQuery("technologies",
queryBuilder,
ScoreMode.Avg));
searchRequest.source(searchSourceBuilder);
SearchResponse response =
client.search(searchRequest, RequestOptions.DEFAULT);
Что-то мне не хватает при поиске документов? Пожалуйста помоги мне с этим. Спасибо.