Поиск ElasticSearch по значениям полей не возвращает

#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 определенно есть несколько проблем

  1. Кажется, что provider поле имеет объектный или вложенный тип, хотя в вашем запросе вы просто упоминаете Coursera , но оно должно быть сопоставлено с name подполем provider поля и на основе объекта или вложенного типа данных вам необходимо изменить свой запрос.

  2. Вы используете 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);