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 系统,提供高效的搜索功能。

相关推荐
超爱吃士力架43 分钟前
邀请逻辑
java·linux·后端
AskHarries3 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion4 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp4 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder4 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚5 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心6 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴7 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲7 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
机器之心7 小时前
AAAI 2025|时间序列演进也是种扩散过程?基于移动自回归的时序扩散预测模型
人工智能·后端