Переглянути джерело

知识检索新增 Content入参

qinchaoyue 6 місяців тому
батько
коміт
0556cdb5f4

+ 11 - 6
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -661,25 +661,30 @@ namespace Hotline.Api.Controllers
                 foreach (var keyword in keywords)
                 {
                     if (dto.RetrievalType == EKnowledgeRetrievalType.All)
-                        exp.Or(m => m.Title.Contains(keyword) || m.Content.Contains(keyword));
+                        exp.Or(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
-                        exp.Or(m => m.Title.Contains(keyword));
+                        exp.Or(x => x.Title.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
-                        exp.Or(m => m.Content.Contains(keyword));
+                        exp.Or(x => x.Content.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
-                        exp.Or(m => m.Summary != null && m.Summary.Contains(keyword));
+                        exp.Or(x => x.Summary != null && x.Summary.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
                     {
                         var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 0);
                         if (keywordEntity is null) continue;
-                        exp.Or(m => SqlFunc.JsonArrayAny(m.Keywords, keywordEntity.Id));
+                        exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
                     }
                 }
                 sugar.Where(exp.ToExpression());
             }
             if (dto.Content.NotNullOrEmpty())
             {
-                var keywords = dto.Content.SplitKeywords();
+                var keywords = dto.Content!.GetSegment();
+                var keywordIds = _knowledgeWordRepository.Queryable()
+                    .Where(m => keywords.Contains(m.Tag))
+                    .Select(m => m.Id)
+                    .ToList();
+                sugar = sugar.Where(x => SqlFunc.JsonArrayAny(x.Keywords, keywordIds));
             }
 
             switch (dto.Sort)

+ 0 - 1
src/Hotline.Application/Hotline.Application.csproj

@@ -9,7 +9,6 @@
   <ItemGroup>
     <PackageReference Include="HtmlToOpenXml.dll" Version="3.2.0" />
     <PackageReference Include="JiebaAspNetCore.Segmenter" Version="1.0.1" />
-    <PackageReference Include="JV.PanGu.Core" Version="1.0.1" />
     <PackageReference Include="NPOI" Version="2.7.0" />
     <PackageReference Include="OpenHtmlToPdf" Version="1.12.0" />
     <PackageReference Include="XC.RSAUtil" Version="1.3.6" />

+ 1 - 0
src/Hotline.Share/Hotline.Share.csproj

@@ -12,6 +12,7 @@
 
   <ItemGroup>
     <PackageReference Include="DocXCore" Version="1.0.10" />
+    <PackageReference Include="JV.PanGu.Core" Version="1.0.1" />
     <PackageReference Include="Mapster" Version="7.4.0" />
     <PackageReference Include="MediatR.Contracts" Version="2.0.1" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />

+ 17 - 2
src/Hotline.Share/Tools/StringExtensions.cs

@@ -1,4 +1,5 @@
-using System.Text.RegularExpressions;
+using PanGu;
+using System.Text.RegularExpressions;
 
 namespace Hotline.Share.Tools;
 public static class StringExtensions
@@ -44,7 +45,21 @@ public static class StringExtensions
         return Regex.IsMatch(value, phoneNumberPattern);
     }
 
-    public static IList<string> SplitKeywords(this string value)
+    /// <summary>
+    /// 通过 PanGu 进行分词
+    /// </summary>
+    /// <param name="value"></param>
+    /// <returns></returns>
+    public static IList<string> GetSegment(this string value)
+    {
+        return new Segment()
+            .DoSegment(value)
+            .Where(word => word.WordType == WordType.SimplifiedChinese && word.Word.Length > 1)
+            .Select(word => word.Word)
+            .ToList();
+    }
+
+        public static IList<string> SplitKeywords(this string value)
     {
         var regex = new Regex(@"[ ,,]+");