получить данные из вложенного поля, применив обязательный запрос в эластичном поиске

У меня есть три таблицы. Их структура такая:

public class RcItem{
 @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "rcItem")
    @JsonManagedReference
    private Set<RcItemRegulation> rcItemRegulations = new HashSet<>();
}

public class RcItemRegulation{
@ManyToOne
    @JoinColumn(name = "rc_item_id")
    @Field(type = FieldType.Nested, index = FieldIndex.analyzed, analyzer = "lowercase_keyword", store = true)
    @JsonBackReference
    private RcItem rcItem;

    @ManyToOne
    @JoinColumn(name = "rgltn_id")
    @Field(type = FieldType.Nested, index = FieldIndex.analyzed, analyzer = "lowercase_keyword", store = true)
    private Regulation regulation;
}

public class Regulation{
 @OneToMany(cascade = CascadeType.ALL, mappedBy = "regulation")
    @JsonManagedReference
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<RcItemRegulation> rcItemRegulations = new HashSet<>();

   @Column(name = "rgltn_full_name")
    @Field(type = FieldType.String, index = FieldIndex.analyzed, analyzer = "lowercase_keyword", store = true)
    private String rgltnFullName;
}

Этот вышеуказанный индекс данных в моей структуре данных, такой как -

"rcItemRegulations": [
                  {
                     "id": 1,
                     "rcItemRgltnType": "primary",
                     "regulation": {

                        "rgltnFullName": "17 ABC § 1.12(f)(5)(i)(B)"

                     }
                  }]

Для этого я пробую эластичный поисковый запрос -

{"query":{
  "bool" : {
    "must" : {
      "bool" : {
        "must" : [ {
          "term" : {
            "rcItemRegulations.rcItemRgltnType" : "primary"
          }
        }, {
          "term" : {
           "rcItemRegulations.regulation.rgltnFullName" : "17 ABC § 1.12(f)(5)(i)(B)"
          }
        } ]
      }
    }
  }
}
}

Это дает мне пустой массив результатов, даже если он существует. Пожалуйста, помогите мне получить данные из эластичного поиска.


person parita porwal    schedule 16.05.2017    source источник
comment
вы должны использовать «вложенный» и «путь». проверьте этот пример. elastic.co/guide/en/elasticsearch/guide/ текущий/   -  person pvpkiran    schedule 16.05.2017


Ответы (1)


я смотрел вниз на вашу проблему. у меня есть два предложения для вас.

Первый

Поскольку rcItemRegulations представляет собой массив объектов, и вы пытаетесь выполнить поиск на основе значений внутри rcItemRegulations. Поэтому я предлагаю вам отобразить их как вложенный тип данных. Вы можете использовать следующие сопоставления. Кроме того, поскольку вы выполняете точное соответствие значений, я добавил анализатор ключевых слов, который сохранит те же точные значения в инвертированном индексе.

Сопоставления

{
    "settings": {
        "analysis": {
            "analyzer": {
                "index_analyzer_v1": {
                    "tokenizer": "keyword",
                    "filter": ["lowercase"]
                }
            }
        }
    },
    "mappings": {
        "type_1": {
            "properties": {
                "rcItemRegulations": {
                    "type": "nested",
                    "properties": {
                        "regulation": {
                            "type": "object",
                            "properties": {
                                "rgltnFullName": {
                                    "type": "text",
                                    "analyzer": "index_analyzer_v1"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Во-вторых, вам также потребуется изменить запрос, так как на этот раз вы запрашиваете вложенный тип данных. Вы должны использовать nested_query

{
    "query": {
        "bool": {
            "must": [{
                "nested": {
                    "path": "rcItemRegulations",
                    "query": {
                        "bool": {
                            "must": [{
                                "term": {
                                    "rcItemRegulations.rcItemRgltnType": "primary"
                                }
                            }, {
                                "term": {
                                    "rcItemRegulations.regulation.rgltnFullName": "17 abc § 1.12(f)(5)(i)(b)"
                                }
                            }]
                        }
                    }
                }
            }]
        }
    }
}

Примечание: строчными буквами весь текст в поисковом запросе.

person user3775217    schedule 16.05.2017
comment
Я попытался добавить @Field(type = FieldType.Nested, index = FieldIndex.analyzed, Analyzer = lowercase_keyword, store = true) private Set‹RcItemRegulation› rcItemRegulations = new HashSet‹›(); в RcItem и удалить @Field из приватного RcItem rcItem; в RcItemRegulation. и запустите свой запрос, он дает исключение - [nested] не удалось найти вложенный объект по пути [rcItemRegulations], - person parita porwal; 16.05.2017
comment
что-то не так с вашим кодом С#. Вы пробовали сырые сопоставления на ES? - person user3775217; 16.05.2017