首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NEST 7进行ElasticSearch排序

使用NEST 7进行ElasticSearch排序
EN

Stack Overflow用户
提问于 2020-06-01 15:47:34
回答 2查看 237关注 0票数 0

我使用的是ElarsticSearch 7.7和NEST 7.7,并且我尝试使用排序函数。但我得到了一个错误,

我收到一个错误,说"Type: illegal_argument_exception Reason:“文本字段没有针对需要每个文档的字段数据的操作进行优化,因此这些操作在默认情况下是禁用的。请改用关键字字段。或者,在name上设置fielddata=true,以便通过取消倒排索引来加载域数据。请注意,这会占用大量内存。“原因:”类型: illegal_argument_exception原因:“文本字段没有针对需要每个文档的字段数据的操作进行优化,因此默认情况下禁用这些操作。请改用关键字字段。或者,在名称上设置fielddata=true,以便通过取消倒置来加载字段数据

下面是我的代码

代码语言:javascript
复制
public SearchResult Search(string searchQuery, int storeId, int pageNumber = 1, int pageSize = 10, IList<SearchFilter> requestFilter = null, decimal? priceFrom = null, decimal? priceTo = null, string sortBy = null)
    {
        var queryContainer = new QueryContainer(); 
        var multiMatch = new QueryStringQuery
        {
            Fields = Infer.Field<ElasticIndexGroupProduct>(p => p.Name)
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.CategoryName))
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.VendorName))                        
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x => x.Name)))
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x => x.CategoryName)))                        
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x => x.ManufacturerName)))
                     .And(Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x => x.ShortDescription))),
            Boost = 1.1,
            Name = "named_query",
            Query = searchQuery,
            DefaultOperator = Operator.Or,
            Analyzer = "standard",
            QuoteAnalyzer = "keyword",
            AllowLeadingWildcard = true,
            MaximumDeterminizedStates = 2,
            Escape = true,
            FuzzyPrefixLength = 2,
            FuzzyMaxExpansions = 3,
            FuzzyRewrite = MultiTermQueryRewrite.ConstantScore,
            Rewrite = MultiTermQueryRewrite.ConstantScore,
            Fuzziness = Fuzziness.Auto,
            TieBreaker = 1,
            AnalyzeWildcard = true,
            MinimumShouldMatch = 2,
            QuoteFieldSuffix = "'",
            Lenient = true,
            AutoGenerateSynonymsPhraseQuery = false
        };
        queryContainer &= multiMatch;        

        //sorting 
        var sorts = new List<ISort>();
        switch (sortBy)
        {
            case "z-a":
                sorts.Add(new FieldSort { Field = Infer.Field<ElasticIndexGroupProduct>(p => p.Name), Order = SortOrder.Descending });
                sorts.Add(new FieldSort { Field = Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x=>x.Name)), Order = SortOrder.Descending });
                break;
            default:
                sorts.Add(new FieldSort { Field = Infer.Field<ElasticIndexGroupProduct>(p => p.Name), Order = SortOrder.Ascending });
                sorts.Add(new FieldSort { Field = Infer.Field<ElasticIndexGroupProduct>(p => p.AssociatedProducts.Select(x => x.Name)), Order = SortOrder.Ascending });
                break;
        }

       var searchRequest = new SearchRequest<ElasticIndexGroupProduct>()
        {
            Profile = true,
            Query = queryContainer,
            From = (pageNumber - 1) * pageSize,
            Size = pageSize,
            Version = true,
            Sort = sorts
        };

        var searchResponse = _client.Search<ElasticIndexGroupProduct>(searchRequest);
        return GenerateSearchResult(searchQuery, searchResponse);
    }

这就是错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-01 18:06:11

找到了解决方案。需要在关键字上设置fielddata=true,以便通过取消倒排索引将字段数据加载到内存中。

代码语言:javascript
复制
[ElasticsearchType(RelationName = "searchproduct")]
    public class ElasticIndexGroupProduct
    {
        [Text(Fielddata = true)]
        public string Name { get; set; }
    }
票数 0
EN

Stack Overflow用户

发布于 2020-06-01 21:01:02

如果您希望能够对Name执行全文搜索以及对其进行排序和聚合,那么您可能希望将其作为同时具有textkeyword数据类型multi_field进行索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62127724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档