Elasticsearch, эквивалент SelectMany - PullRequest
0 голосов
/ 17 июня 2020

У меня есть вложенный тип в индексе Elasticsearch:

class Category
{
    public string Name;
    public Category Child;
    public Guid[] ProductIds;
}

Например:

Category1
|_Category2
|_Category3
  |_Category4

Категория 3 и Категория 4 имеют по 2 продукта каждая.

Что такое правильный запрос NEST, чтобы получить все 4 идентификатора продукта с помощью поиска «Category3»?

Я представляю что-то вроде этого, но на самом деле не могу заставить его работать:

var response = await elasticClient.SearchAsync<Category>(s => s
    .StoredFields(sf => sf
        .Fields(f => f.ProductIds)
    )
    .Query(q => q
        .Nested(n => n
            .Path(p => p.Child)
            .Query(mu => mu
                .Bool(b => b
                    .Must(m => m
                        .Match(m => m
                            .Query("Category Name")
                        )
                    )
                )
            )
        )
    )
)

1 Ответ

0 голосов
/ 17 июня 2020

Одним из вариантов может быть создание своего рода столбца иерархии хлебных крошек и использование анализатора и фасета для поиска по нему.

Таким образом, индекс может иметь аналогичные настройки для столбца и анализатора

    "btb_breadcrumb": {
      "type": "text",
      "fields": {
        "facet": { 
          "type":  "text",
          "analyzer": "custom_path_tree",
          "fielddata": "true"
        }
      }
    },  



"settings" : {
    "analysis": {
      "analyzer": {
        "english_exact": {
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        },
        "custom_path_tree": {
          "tokenizer": "custom_hierarchy"
        },
        "custom_path_tree_reversed": {
          "tokenizer": "custom_hierarchy_reversed"
        }           
      },
      "tokenizer": {
        "custom_hierarchy": {
          "type": "path_hierarchy",
          "delimiter": ">"
        },
        "custom_hierarchy_reversed": {
          "type": "path_hierarchy",
          "delimiter": ">",
          "reverse": "true"
        }
      }   
    }
  }         

, а затем вы можете выполнить поиск в этом столбце следующим образом:

{

"bool" : 
{
    "must" : 
    [               
            {"match" : {"btb_breadcrumb.facet" :  "catid1>catid2>"}}

    ]
}

}

теперь это даст вам все элементы с catid2 и всеми его дочерними категориями. Точно так же, если вы хотите получить все элементы, которые подпадают под любые дочерние элементы catid1, вы можете использовать следующий запрос.

{

"bool" : 
{
    "must" : 
    [               
            {"match" : {"btb_breadcrumb.facet" :  "catid1>"}}

    ]
}

}

...