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 }