Lucene.NET 的搜索服务

为了在 .NET Core 中创建一个基于 Lucene.NET 的搜索服务,您可以按照以下步骤进行操作。这个示例将展示如何创建一个简单的 .NET Core Web API 项目,并在其中集成 Lucene.NET 来实现索引和搜索功能。

1. 创建 .NET Core Web API 项目

首先,创建一个新的 .NET Core Web API 项目:

bash 复制代码
dotnet new webapi -n LuceneSearchService
cd LuceneSearchService

2. 安装 Lucene.NET

通过 NuGet 包管理器安装 Lucene.NET

bash 复制代码
dotnet add package Lucene.Net --version 4.8.0-beta00016
dotnet add package Lucene.Net.Analysis.Common --version 4.8.0-beta00016
dotnet add package Lucene.Net.QueryParser --version 4.8.0-beta00016

3. 创建 Lucene 索引和搜索服务

在项目中添加一个新的服务类,用于处理 Lucene 索引和搜索操作。

3.1 创建 LuceneService

在项目中添加一个名为 Services 的文件夹,然后在该文件夹中创建一个名为 LuceneService.cs 的文件。

csharp 复制代码
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;
using System;
using System.Collections.Generic;
using System.IO;

namespace LuceneSearchService.Services
{
    public class LuceneService
    {
        private const LuceneVersion AppLuceneVersion = LuceneVersion.LUCENE_48;
        private readonly string _indexPath;
        private readonly Directory _indexDirectory;
        private readonly Analyzer _analyzer;

        public LuceneService(string indexPath)
        {
            _indexPath = indexPath;
            _indexDirectory = FSDirectory.Open(new DirectoryInfo(indexPath));
            _analyzer = new StandardAnalyzer(AppLuceneVersion);
        }

        public void IndexDocument(string title, string content, string author)
        {
            var config = new IndexWriterConfig(AppLuceneVersion, _analyzer);
            using var writer = new IndexWriter(_indexDirectory, config);

            var doc = new Document
            {
                new TextField("title", title, Field.Store.YES),
                new TextField("content", content, Field.Store.YES),
                new TextField("author", author, Field.Store.YES)
            };
            writer.AddDocument(doc);
            writer.Flush(triggerMerge: false, applyAllDeletes: false);
        }

        public List<Dictionary<string, string>> Search(string queryText)
        {
            using var reader = DirectoryReader.Open(_indexDirectory);
            var searcher = new IndexSearcher(reader);

            var parser = new MultiFieldQueryParser(AppLuceneVersion, new[] { "title", "content", "author" }, _analyzer);
            var query = parser.Parse(queryText);

            var hits = searcher.Search(query, 10).ScoreDocs;
            var results = new List<Dictionary<string, string>>();

            foreach (var hit in hits)
            {
                var doc = searcher.Doc(hit.Doc);
                var result = new Dictionary<string, string>
                {
                    { "title", doc.Get("title") },
                    { "content", doc.Get("content") },
                    { "author", doc.Get("author") }
                };
                results.Add(result);
            }

            return results;
        }
    }
}

3.2 配置依赖注入

Startup.cs 文件中配置依赖注入,以便可以在控制器中使用 LuceneService

csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // 配置 LuceneService 并添加到依赖注入容器
    var luceneIndexPath = Path.Combine(Environment.CurrentDirectory, "lucene_index");
    if (!Directory.Exists(luceneIndexPath))
    {
        Directory.CreateDirectory(luceneIndexPath);
    }
    services.AddSingleton(new LuceneSearchService.Services.LuceneService(luceneIndexPath));
}

4. 创建控制器

在项目中添加一个新的控制器来处理文档索引和搜索请求。

4.1 创建 SearchController

Controllers 文件夹中创建一个名为 SearchController.cs 的文件。

csharp 复制代码
using LuceneSearchService.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace LuceneSearchService.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class SearchController : ControllerBase
    {
        private readonly LuceneService _luceneService;

        public SearchController(LuceneService luceneService)
        {
            _luceneService = luceneService;
        }

        [HttpPost("index")]
        public IActionResult IndexDocument([FromBody] DocumentModel model)
        {
            _luceneService.IndexDocument(model.Title, model.Content, model.Author);
            return Ok();
        }

        [HttpGet("search")]
        public IActionResult Search([FromQuery] string query)
        {
            var results = _luceneService.Search(query);
            return Ok(results);
        }
    }

    public class DocumentModel
    {
        public string Title { get; set; }
        public string Content { get; set; }
        public string Author { get; set; }
    }
}

4.2 配置路由和启动设置

确保在 Startup.cs 文件中配置了路由和中间件:

csharp 复制代码
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

5. 运行和测试

现在,可以运行该应用程序并测试索引和搜索功能。

5.1 运行应用程序

bash 复制代码
dotnet run

5.2 测试索引文档

使用 curl 或 Postman 发送一个 POST 请求来索引文档:

bash 复制代码
curl -X POST "https://localhost:5001/api/search/index" -H "Content-Type: application/json" -d '{
  "title": "Lucene in Action",
  "content": "A comprehensive guide to Lucene.",
  "author": "Erik Hatcher"
}'

5.3 测试搜索功能

使用 curl 或 Postman 发送一个 GET 请求来搜索文档:

bash 复制代码
curl "https://localhost:5001/api/search/search?query=Lucene"

以上步骤将创建一个基于 .NET Core 的 Web API 服务,使用 Lucene.NET 实现文档的索引和搜索功能。这可以作为在 CIMS 系统中集成 Lucene.NET 的基础。您可以根据具体需求进一步扩展和优化这个服务。

为了更清楚地说明 Lucene.NET 搜索服务的执行流程,我们将详细描述每个步骤及其内部机制。下面是基于上述方案的执行流程:

1. 初始化项目

1.1 创建 .NET Core Web API 项目

bash 复制代码
dotnet new webapi -n LuceneSearchService
cd LuceneSearchService

1.2 安装 Lucene.NET

bash 复制代码
dotnet add package Lucene.Net --version 4.8.0-beta00016
dotnet add package Lucene.Net.Analysis.Common --version 4.8.0-beta00016
dotnet add package Lucene.Net.QueryParser --version 4.8.0-beta00016

2. 配置和实现 Lucene 服务

2.1 创建 LuceneService 类

Services 文件夹中创建 LuceneService.cs

csharp 复制代码
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;
using System;
using System.Collections.Generic;
using System.IO;

namespace LuceneSearchService.Services
{
    public class LuceneService
    {
        private const LuceneVersion AppLuceneVersion = LuceneVersion.LUCENE_48;
        private readonly string _indexPath;
        private readonly Directory _indexDirectory;
        private readonly Analyzer _analyzer;

        public LuceneService(string indexPath)
        {
            _indexPath = indexPath;
            _indexDirectory = FSDirectory.Open(new DirectoryInfo(indexPath));
            _analyzer = new StandardAnalyzer(AppLuceneVersion);
        }

        public void IndexDocument(string title, string content, string author)
        {
            var config = new IndexWriterConfig(AppLuceneVersion, _analyzer);
            using var writer = new IndexWriter(_indexDirectory, config);

            var doc = new Document
            {
                new TextField("title", title, Field.Store.YES),
                new TextField("content", content, Field.Store.YES),
                new TextField("author", author, Field.Store.YES)
            };
            writer.AddDocument(doc);
            writer.Flush(triggerMerge: false, applyAllDeletes: false);
        }

        public List<Dictionary<string, string>> Search(string queryText)
        {
            using var reader = DirectoryReader.Open(_indexDirectory);
            var searcher = new IndexSearcher(reader);

            var parser = new MultiFieldQueryParser(AppLuceneVersion, new[] { "title", "content", "author" }, _analyzer);
            var query = parser.Parse(queryText);

            var hits = searcher.Search(query, 10).ScoreDocs;
            var results = new List<Dictionary<string, string>>();

            foreach (var hit in hits)
            {
                var doc = searcher.Doc(hit.Doc);
                var result = new Dictionary<string, string>
                {
                    { "title", doc.Get("title") },
                    { "content", doc.Get("content") },
                    { "author", doc.Get("author") }
                };
                results.Add(result);
            }

            return results;
        }
    }
}

2.2 配置依赖注入

Startup.cs 中配置依赖注入:

csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    var luceneIndexPath = Path.Combine(Environment.CurrentDirectory, "lucene_index");
    if (!Directory.Exists(luceneIndexPath))
    {
        Directory.CreateDirectory(luceneIndexPath);
    }
    services.AddSingleton(new LuceneSearchService.Services.LuceneService(luceneIndexPath));
}

3. 实现控制器

3.1 创建 SearchController 类

Controllers 文件夹中创建 SearchController.cs

csharp 复制代码
using LuceneSearchService.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace LuceneSearchService.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class SearchController : ControllerBase
    {
        private readonly LuceneService _luceneService;

        public SearchController(LuceneService luceneService)
        {
            _luceneService = luceneService;
        }

        [HttpPost("index")]
        public IActionResult IndexDocument([FromBody] DocumentModel model)
        {
            _luceneService.IndexDocument(model.Title, model.Content, model.Author);
            return Ok();
        }

        [HttpGet("search")]
        public IActionResult Search([FromQuery] string query)
        {
            var results = _luceneService.Search(query);
            return Ok(results);
        }
    }

    public class DocumentModel
    {
        public string Title { get; set; }
        public string Content { get; set; }
        public string Author { get; set; }
    }
}

4. 运行和测试

4.1 运行应用程序

启动应用程序:

bash 复制代码
dotnet run

4.2 测试索引文档

使用 curl 或 Postman 发送 POST 请求以索引文档:

bash 复制代码
curl -X POST "https://localhost:5001/api/search/index" -H "Content-Type: application/json" -d '{
  "title": "Lucene in Action",
  "content": "A comprehensive guide to Lucene.",
  "author": "Erik Hatcher"
}'

4.3 测试搜索功能

使用 curl 或 Postman 发送 GET 请求以执行搜索:

bash 复制代码
curl "https://localhost:5001/api/search/search?query=Lucene"

执行流程详细描述

1. 初始化和配置

  1. 创建项目和安装包 :通过 dotnet new webapi 创建项目并安装 Lucene.NET 包。
  2. 配置服务 :在 Startup.cs 中配置依赖注入,将 LuceneService 添加到服务容器中。

2. 实现 LuceneService

  1. 构造函数:初始化 Lucene 的索引目录和分析器。
  2. IndexDocument 方法 :接收文档信息并创建 Lucene 文档,使用 IndexWriter 将其添加到索引中。
  3. Search 方法 :接收查询字符串,使用 MultiFieldQueryParser 解析查询并使用 IndexSearcher 执行搜索,返回匹配的文档。

3. 实现控制器

  1. SearchController:定义两个端点,一个用于索引文档,一个用于执行搜索。
  2. IndexDocument 端点 :接收文档信息并调用 LuceneService.IndexDocument 方法索引文档。
  3. Search 端点 :接收查询字符串并调用 LuceneService.Search 方法执行搜索,返回搜索结果。

4. 运行和测试

  1. 启动应用程序 :使用 dotnet run 启动 Web API 服务。
  2. 测试索引功能 :发送 POST 请求到 /api/search/index 端点,提交文档信息以索引文档。
  3. 测试搜索功能 :发送 GET 请求到 /api/search/search 端点,提交查询字符串以执行搜索并获取结果。

通过以上步骤,您可以创建一个基于 Lucene.NET 的搜索服务,支持文档的索引和全文搜索功能。这个服务可以集成到更大的系统中,如 doc 系统,提供高效的搜索功能。

相关推荐
序安InToo6 分钟前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy1236 分钟前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记9 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang059 分钟前
VS Code 配置 Markdown 环境
后端
navms12 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang0512 分钟前
离线数仓的优化及重构
后端
Nyarlathotep011313 分钟前
gin01:初探gin的启动
后端·go
JxWang0514 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0515 分钟前
Windows Terminal 配置 oh-my-posh
后端
SimonKing31 分钟前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员