#java #elasticsearch #liferay
#java #elasticsearch #liferay
Вопрос:
Допустим, у меня есть документ в эластичном поиске, который содержит поле «provider» в _source.
Я испробовал много запросов, но ни один из них, похоже, не возвращает документ с искомым значением.
Документ:
"_source" : {
"jobs" : [ ],
"provider" : {
"id" : "1",
"name" : "Coursera"
},
"sckLevels" : [ ],
"scks" : [ ],
"trArea" : [ ],
"trElems" : [ ],
"training" : {
"description" : "Cyber sec desc",
"id" : "0",
"img" : "img link",
"link" : "https://google.com",
"name" : "Cyber sec",
"trainingProvID" : "1"
}
И мой код для запроса:
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("provider", "Coursera"));
searchRequest.source(sourceBuilder);
this.multiRequest.add(searchRequest);
Мой ответ пустой.
Спасибо.
Комментарии:
1. Примечание: Всегда предоставляйте свое отображение, образцы документов и ожидаемые результаты при задании вопроса ES, но есть несколько проблем, упомянутых в моем ответе, пожалуйста, исправьте их, и это должно сработать.
Ответ №1:
С вашим запросом Elasticsearch определенно есть несколько проблем
-
Кажется, что
provider
поле имеет объектный или вложенный тип, хотя в вашем запросе вы просто упоминаетеCoursera
, но оно должно быть сопоставлено сname
подполемprovider
поля и на основе объекта или вложенного типа данных вам необходимо изменить свой запрос. -
Вы используете
term query
которое не анализируется и используется для ключевого слова, т.Е. extact match, в то время как, если вашеname
поле определено какtext
, оно будет в нижнем регистре во время индексации иCoursera
с заголовкомC
не будет совпадать, вам нужно использоватьmatch
запрос для текстовых полей.
Ответ №2:
спасибо, проблема заключалась в вложенности. Я думал, что он выполнит поиск по объекту.
Наткнулся на хорошую тему.
Решил это так:
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("provider.name", "Coursera"));
searchRequest.source(sourceBuilder);
this.multiRequest.add(searchRequest);