如何使用要点在NEST弹性搜索中基于命中分数对结果进行排序

时间:2016-07-05 09:52:15

标签: c# elasticsearch nest

我正在使用NEST(c#)与Elasticsearch 1.7.3版进行通信

我正在传递一个字符串并尝试在该字符串中匹配多个字段。 我正在获得要点,以确定字符串中匹配的字段数。 从Hits.Select。

中撤回结果

但问题是,有时亮点中最匹配的字段不会出现在Hits.Select列表的顶部。 有什么可以设置的吗??

            var result = this.client.Search<PInfo>(s => s
                .Take(20)
                .TrackScores(true)
                .Query(q => q
                .MultiMatch(m => m
                .Type(TextQueryType.CrossFields)
                .OnFieldsWithBoost(b => b
                .Add(f => f.A, 1.0)
                .Add(f => f.B, 1.0)
                .Add(f => f.C, 1.0)
                )
                .Operator(Operator.Or)
                .Query(text)
                ))
                .Highlight( h => h
                //.PreTags("<b>")
                //.PostTags("</b>")
                .OnFields(
                fk => fk.OnField( a => a.A),
                fk => fk.OnField( a => a.B),
                fk => fk.OnField( a => a.C)

                )
                )
                .Sort(sort => sort.OnField("_score").Descending())
                );

            string value = result.ConnectionStatus.ToString();



            return result
                .Hits
                .Select(c => new PInfo
                {
                    Id = c.Source.Id,
                    A = c.Source.A,
                    B = c.Source.B,
                    C = c.Source.C,
                    IndexedOn = c.Source.IndexedOn,
                    Highlights = c.Highlights // returning the highlights too from here
                })
                .ToList();

1 个答案:

答案 0 :(得分:0)

这应该得到理想的结果。

            return result
                .Hits
                .Select(c => new PatientInfo
                {
                    Id = c.Source.Id,
                    Patient_Num = c.Source.Patient_Num,
                    First_Name = c.Source.First_Name,
                    Last_Name = c.Source.Last_Name,
                    Full_Name = c.Source.Full_Name,
                    Address = c.Source.Address,
                    City = c.Source.City,
                    State = c.Source.State,
                    Zip = c.Source.Zip,
                    Relation_Code = c.Source.Relation_Code,
                    DOB = c.Source.DOB,
                    Sex = c.Source.Sex,
                    IndexedOn = c.Source.IndexedOn,
                    Highlights = c.Highlights
                })
                .OrderByDescending(t => t.Highlights.Count).ToList();