天天看點

推薦一個C#全文搜尋支援Linq表達式的開源項目

上次給大家推薦過一個基于Lucene全文搜尋庫:《一個基于EntityFrameworkCore+Lucene實作的全文搜尋引擎庫》,今天再給大家推薦一個更輕量的全文搜尋,它肯定沒有基于Lucene全文搜尋性能高,但可以用在一些簡單的業務場景中。

項目簡介

這是一個IQueryable與IEnumerable擴充方法庫,該項目已經上傳至nuget,可以直接通過指令安裝使用。

主要特色功能有:

1、支援Linq寫法;

2、支援模糊搜尋、等于搜尋、開頭比對、結尾比對、比對數量排序等功能。

技術架構

1、平台:Net4.5、netstandard1.0。

2、開發工具:Visual Studio 2018

項目結構

推薦一個C#全文搜尋支援Linq表達式的開源項目

功能

一、IQueryable擴充提供方法清單:

  • Containing: 模糊比對搜尋
  • IsEqual :是否等于比對搜尋
  • StartsWith:開頭比對搜尋

1、Containing使用方法

//單個屬性比對單個詞
var result = queryableData.Search(x => x.Property1)
            .Containing("searchTerm");


//多個個屬性比對單個詞
var result = queryableData
            .Search(x => x.Property1, x => x.Property2, x => x.Property3) 
            .Containing("searchTerm"); 


//在單個屬性中搜尋多個搜尋詞
var result = queryableData
            .Search(x => x.Property1) 
            .Containing("search", "term"); 


//在多個屬性中搜尋多個搜尋詞
var result = queryableData
             .Search(x => x.Property1, x => x.Property2, x => x.Property3) 
              .Containing("searchTerm1", "searchTerm2", "searchTerm3");           

2、Containing與Search組合使用

var result = queryableData.Search(x => x.Property1) 
            .Containing("searchTerm1") 
            .Search(x => x.Property1) 
            .Containing("searchTerm2");           

3、IsEqual使用方法

var result = queryableData
              .Search(x => x.Property1, x => x.Property2, x => x.Property3) 
              .IsEqual("searchTerm1", "searchTerm2", "searchTerm3");           

4、StartsWith使用方法

var result = queryableData
            .Search(x => x.Property1, x => x.Property2, x => x.Property3) 
            .StartsWith("searchTerm1", "searchTerm2", "searchTerm3");           

二、IEnumerable擴充提供方法清單:

  • SetCulture:指定比對模式
  • Containing :模糊比對搜尋
  • IsEqual :等于比對搜尋
  • StartsWith :開頭比對搜尋
  • EndsWith :結尾比對搜尋

使用方法:

var result = enumerableData.Search(x => x.Property1) 
            .SetCulture(StringComparison.OrdinalIgnoreCase) 
            .StartsWith("abc") 
            // Uses OrdinalIgnoreCase 
            .SetCulture(StringComparison.Ordinal) 
            .EndsWith("xyz") 
            // Uses Ordinal 
            .SetCulture(StringComparison.CurrentCulture) 
            .Containing("mno"); 
            //Uses CurrentCulture           

三、比對數量排序搜尋

IQueryable和IEnumerable擴充都支援:排序搜尋。根據比對數量排序傳回搜尋結果,使用方法如下:

定義實體

public interface IRanked<out T>
{
    int Hits { get; }
    T Item { get; }
}           

排序搜尋,在單個屬性中搜尋單個搜尋詞:‍

var result = queryableData.Search(x => x.Property1)
                          .Containing("searchTerm")
                          .ToRanked();           

排序搜尋,在多個屬性中搜尋單個搜尋詞

var result = queryableData.Search(x => x.Property1, x => x.Property2, x => x.Property3)
                          .Containing("searchTerm")
                          .ToRanked();           

比對結果排序并傳回前面10條‍

var result = context.Users.Search(x => x.FirstName, x => x.LastName, x.MiddleName)
                          .Containing("John")
                          .ToRanked()
                          .OrderByDescending(r => r.Hits) // Order by Hits property of IRanked<User>
                          .Take(10);           

四、Soundex搜尋

var result = data.SoundexOf(x => x.Property1, x => x.PropertyTwo)
                 .Matching("test", "another")           

五、ReverseSoundex搜尋

var result = data.ReverseSoundexOf(x => x.Property1, x => x.PropertyTwo)
                 .Matching("test")           
項目位址:https://github.com/ninjanye/SearchExtensions

- End -

推薦閱讀

  • 基于.Net開發的對比Html效果差異的開源項目
  • 一個基于.Net Core開源個人部落格網站
  • 基于 .NET Core MVC 的權限管理系統
  • 「最新」.Net程式員學習路線圖以及就業現狀
  • 推薦基于.NET 6.0開發的開源訪客系統
  • Net5開發的視訊監控管理系統

繼續閱讀