es 实现高亮

 

 1 在 Elasticsearch 7.17.0 中,可以使用以下 Nest 代码来在多个字段上进行高亮:
 2 
 3 ```csharp
 4 var highlightFields = new HighlightFieldDescriptor<MyDocument>[] 
 5 {
 6     h => h.Field(f => f.Field1), 
 7     h => h.Field(f => f.Field2)
 8 };
 9 
10 var searchResponse = client.Search<MyDocument>(s => s
11     .Index("myindex")
12     .Query(q => q
13         .Match(m => m
14             .Field(f => f.Field1)
15             .Query("myquery")
16         )
17     )
18     .Highlight(h => h
19         .PreTags("<em>")
20         .PostTags("</em>")
21         .Fields(highlightFields)
22     )
23 );
24 ```
25 
26 上述代码同时在 `Field1` 和 `Field2` 字段上对包含 "myquery" 的文本进行高亮显示,并使用 `<em>` 和 `</em>` 作为高亮标记。
27 
28 在这里,我们使用 `HighlightFieldDescriptor` 类型的数组来指定要在哪些字段上高亮显示。在高亮字段的 `.Field()` 方法中,我们可以指定每个字段的名称或 lambda 表达式。然后在 `.Highlight()` 方法中,我们指定了包含预/后缀标记、字段数组等选项,以便进行高亮。
29 
30 请注意,使用高亮功能会对 Elasticsearch 查询的性能产生一定的影响,因为它需要对匹配文本进行额外的处理。因此,在使用高亮功能之前,请确保你的 Elasticsearch 集群已正确配置,以确保高效地执行查询操作。

 

 1 您可以将FileName和Content字段添加到Fields字典中,并使用不同的高亮标记将它们与UserName字段区分开来。 
 2 
 3 以下是示例代码,其中将使用不同的高亮标记对UserName、FileName和Content字段进行高亮显示:
 4 
 5 ```
 6 var query = new SearchRequest<EsView>()
 7 {
 8     From = EsHelper.PageIndex(currentPage, pageSize),
 9     Size = pageSize,
10     Query = queryWhere,
11     Sort = new List<ISort>
12     {
13         new FieldSort
14         {
15             Field = new Field("Type"),
16             Order = SortOrder.Descending
17         },
18     },
19     Highlight = new Highlight
20     {
21         Fields = new Dictionary<Field, IHighlightField>
22         {
23             {
24                 "UserName", new HighlightField
25                 {
26                     PreTags = new[] { "<span style=\"color: red\">" },
27                     PostTags = new[] { "</span>" }
28                 }
29             },
30             {
31                 "FileName", new HighlightField
32                 {
33                     PreTags = new[] { "<span style=\"color: green\">" },
34                     PostTags = new[] { "</span>" }
35                 }
36             },
37             {
38                 "Content", new HighlightField
39                 {
40                     PreTags = new[] { "<span style=\"color: blue\">" },
41                     PostTags = new[] { "</span>" }
42                 }
43             }
44         }
45     }
46 };
47 ```
48 
49 在上面的代码中,我们使用不同的高亮标记来区分UserName、FileName和Content字段。具体来说,我们在UserName字段上使用了红色高亮标记,FileName字段上使用了绿色高亮标记,Content字段上使用了蓝色高亮标记。您可以根据需要在PreTags和PostTags属性中更改标记。

 

或者如下:

 1   var query = new SearchRequest<EsView>()
 2             {
 3                 From = EsHelper.PageIndex(currentPage, pageSize),
 4                 Size = pageSize,
 5                 Query = queryWhere,
 6 
 7                 //Sort = new List<ISort>
 8                 //{
 9                 //    new FieldSort
10                 //    {
11                 //        Field = new Field("Type"),
12                 //        Order = SortOrder.Descending
13                 //    },
14                 //},
15 
16                 Highlight = new Nest.Highlight
17                 {
18                     //Fields = new Dictionary<Field, IHighlightField>
19                     //{
20                     //    {
21                     //       "FileContent", new HighlightField() {
22                     //        PreTags = new[] { "<span style=\"color: red\">" },
23                     //        PostTags = new[] { "</span>" }
24                     //       }
25                     //    },
26                     //     {
27                     //       "Code", new HighlightField() {
28                     //        PreTags = new[] { "<span style=\"color: red\">" },
29                     //        PostTags = new[] { "</span>" }
30                     //       }
31                     //    },
32                     //      {
33                     //       "FileName", new HighlightField() {
34                     //        PreTags = new[] { "<span style=\"color: red\">" },
35                     //        PostTags = new[] { "</span>" }
36                     //       }
37                     //    },
38                     //}
39 
40                     Fields = new FluentDictionary<Field, IHighlightField>
41                      {
42                          { "FileContent", new HighlightField() },
43                          { "Code", new HighlightField() },
44                          { "FileName", new HighlightField() }
45                      },
46 
47                     PreTags = new[] { "<em>" },
48                     PostTags = new[] { "</em>" }
49                 }
50             };

 

 1 要替换原文内容中的部分为高亮标签,您可以按照以下步骤进行操作:
 2 
 3 ```c#
 4 foreach (var hit in searchResponse.Hits)
 5 {
 6     var originalText = hit.Source.FileContent; // 获取原始文本
 7 
 8     var highlightedText = hit.Highlight
 9         .SelectMany(h => h.Value.Highlights) // 获取高亮片段
10         .FirstOrDefault();
11 
12     if (highlightedText != null)
13     {
14         // 用高亮标签替换原始文本中的关键词
15         var mergedText = originalText.Replace("教育学院", "<em>教育学院</em>");
16 
17         // 处理替换后的文本
18         Console.WriteLine(mergedText);
19     }
20     else
21     {
22         // 高亮片段为空,直接使用原始文本
23         Console.WriteLine(originalText);
24     }
25 }
26 ```
27 
28 在这个示例中,我们首先获取原始文本以及高亮片段。如果高亮片段存在,则使用`Replace`方法将关键词替换为带有高亮标签的内容。如果高亮片段为空,直接使用原始文本。最后,您可以通过`Console.WriteLine`输出替换后的文本。
29 
30 请注意,在这个示例中,我使用了简单的字符串替换来实现。如果您的需求更为复杂,可能需要使用更强大的文本处理库来处理替换逻辑,并保留原文中的其他内容。这取决于您的具体需求,您可以根据自己的需要进行相应的调整和扩展。

 

 1    var searchHits = searchResponse.Hits;
 2        
 3             foreach (var hit in searchHits)
 4             {
 5                 
 6                     // 高亮片段为空,直接使用原始字段内容
 7                     hit.Source.FileContentSearch = hit.Source.FileContent;
 8                     hit.Source.CodeSearch = hit.Source.Code;
 9                     hit.Source.FileNameSearch = hit.Source.FileName;
10  
11                     foreach (var dic in hit.Highlight)
12                     {
13                         switch (dic.Key)
14                         {
15                             case "FileContent":
16                                 if (dic.Value != null && dic.Value.Any())
17                                 {
18                                     // 处理 FileContent 高亮片段
19                                     hit.Source.FileContentSearch = string.Join("...", dic.Value);
20                                 }
21                                 else
22                                 {
23                                     hit.Source.FileContentSearch = hit.Source.FileContent;
24                                 }                              
25                                 break;
26                             case "Code":
27                                 if (dic.Value != null && dic.Value.Any())
28                                 {
29                                  
30                                     hit.Source.CodeSearch = string.Join("...", dic.Value);
31                                 }
32                                 else
33                                 {
34                                     hit.Source.CodeSearch = hit.Source.Code;
35                                 }
36                                 break;
37                             case "FileName":
38                                 if (dic.Value != null && dic.Value.Any())
39                                 {
40                                
41                                     hit.Source.FileNameSearch = string.Join("...", dic.Value);
42                                 }
43                                 else
44                                 {
45                                     hit.Source.FileNameSearch = hit.Source.FileName;
46                                 }
47                                 break;
48                         }
49                     }
50 
51             }

 

posted @ 2023-06-15 17:19  南方卖菜  阅读(1149)  评论(0编辑  收藏  举报