使用NEST在ElasticSearch的IEnumerable属性上配置分析器的问题

本文关键字:配置 分析器 问题 属性 IEnumerable NEST ElasticSearch 使用 | 更新日期: 2023-09-27 18:03:06

假设我有

class Product
{
  string name;
  List<Order> orders;
}
class Order
{
  string name;
}

如果我尝试将分析器映射到产品名,它可以工作,但不能用于Order.name

//This work and adds the analyzer on the mapping list.
var resp = client.Map<Product>(map => map
                        .Properties(props => props
                            .String(s =>s
                                .Name(p => p.Name)
                                .IndexAnalyzer("normalize")
                            )
                       ));
//This does not.
var resp = client.Map<Product>(map => map
                        .Properties(props => props
                            .String(s =>s
                                .Name(p => p.orders.First().Name)
                                .IndexAnalyzer("normalize")
                            )
                       ));

是我做错了什么,还是这是一个bug?

更多信息:这些类只是显示问题的一个示例。如果我在变量上添加[ElasticProperty(Analyzer = "normalize")],它就可以工作了。

实际上设置类似于Product Inherists from baseproduccuts BaseProductis是List

使用NEST在ElasticSearch的IEnumerable属性上配置分析器的问题

正如这里所回答的,.Name(p => p.Orders.First().Name)告诉ES在Product文档上映射字段'Name'。相反,您希望映射到Orders上的'Name'字段,它是Product文档中的一个数组。

试试这个:

client.Map<Product>(m => m
    .Properties(pp => pp
        // Map Product.Name
        .String(s => s
            .Name(p => p.Name)
            .IndexAnalyzer("normalize")
        )
        // Map Product.Orders.Name
        .Object<List<Order>>(o => o
            .Name(p => p.Orders)
            .Properties(op => op
                .String(s => s
                    .Name(os => os.First().Name)
                    .IndexAnalyzer("normalize"))))
        ));