应用Lucene.Net做一个简易的检索模块

经典著作权申明:原文中来源于于于网友收集或网友提供,倘若有侵权行为个人行为,请转达社区论坛论坛版主或者留言板留言板留言板留言,本手机微信微信公众号立刻删除。返回凡

原题目:应用Lucene.Net做一个简易的检索模块-全篇数据库索引

Lucene.Net

Lucene.net是Lucene的.net移殖版本号,是一个开源系统的全篇查找模块开发设计包,即它并不是一个详细的全篇查找模块,只是一个全篇查找模块的构架,出示了详细的查寻模块和数据库索引模块。

Lucene.net是Apache手机软件股票基金会冠名赞助的开源系统新项目,根据Apache License协议书。

Lucene.net其实不是一个爬取检索模块,都不会全自动地数据库索引內容。
安防监测网站建设案例大家得先即将数据库索引的文本文档中的文字提取出去,随后再将其加到Lucene.net数据库索引中。规范的流程是先原始化一个Analyzer、开启一个IndexWriter、随后再将文本文档一个接一个地加进。一旦进行这种流程,数据库索引便可以在关掉前获得提升,同时需做的更改也会起效。这一全过程将会比开发设计者习惯性的方法更为手工制作化一些,但却在数据信息的数据库索引上给与你大量的灵便性,并且其高效率也很高。

官方网站:http://lucenenet.apache.org/

GitHub: https://github/apache/lucenenet

加上nuget包引入

最先大家要在新项目中引入 Lucene.Net 的有关引入,不一样的語言要应用的剖析器(Analyzer)不是一样的,这儿大家应用 Lucene.Net.Analysis.SmartCn 来做实例,用以剖析汉语。当今 Lucene.Net.Analysis.SmartCn 包还未公布宣布版,因此检索时要启用“包含预发售版本号”:

IndexWriter

IndexWriter 用以将文本文档数据库索引起來,它会应用相匹配的剖析器(Analyzer)来将文本文档中的文本开展分拆数据库索引而且将数据库索引存到 Index_Data 文件目录:

static IndexWriter GetIndexWriter

{

var dir = FSDirectory.Open("Index_Data");

Analyzer analyzer = new SmartChineseAnalyzer(LuceneVersion.LUCENE_48);

var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);

IndexWriter writer = new IndexWriter(dir, indexConfig);

return writer;

}

拥有 IndexWriter ,大家便可以将文本文档数据库索引进去了:

static void WriteDocument(string url, string title, string keywords, string deion)

{

using (var writer = GetIndexWriter)

{

writer.DeleteDocuments(new Term("url", url));

Document doc = new Document;

doc.Add(new StringField("url", url, Field.Store.YES));

TextField titleField = new TextField("title", title, Field.Store.YES);

titleField.Boost = 3F;

TextField keywordField = new TextField("keyword", keywords, Field.Store.YES);

keywordField.Boost = 2F;

TextField deionField = new TextField("deion", deion, Field.Store.YES);

deionField.Boost = 1F;

doc.Add(titleField);

doc.Add(keywordField);

doc.Add(deionField);

writer.AddDocument(doc);

writer.Flush(triggerMerge: true, applyAllDeletes: true);

writer.Commit;

}

}

对编码做一些简易的表明,在案例化一个 Document 后,必须在 Document 里边加上一些字段名:

StringField:将该字段名数据库索引,但不容易做语意分拆 TextField:数据库索引器会对该字段名开展分拆后再数据库索引 Boost:即权重值,例如题目(3F)和重要字(2F)都配对得话,以题目为优先选择排到前边

如今大家早已能够将文本文档数据库索引起來了,大家将数据库索引一个网页页面:

WriteDocument("https://zkea.net/index",

"纸壳CMS开源系统完全免费可视性化设计方案內容管理方法系统软件",

"纸壳CMS,ZKEACMS,可视性化设计方案,可视性化CMS",

"纸壳CMS(ZKEACMS)是开源系统的建网站系统软件,您能够立即应用它来作为您的公司网站,门户网网站或是本人网站,blog");

Index_Data 文件目录可能转化成一些数据库索引文档:

拥有数据库索引,接下去要做的便是检索了。

IndexSearcher

由于客户在检索的情况下其实不单是只键入重要字,极可能键入的是词、句,因此在检索以前,大家也要对检索句子开展剖析,拆卸出里边的重要词后再开展检索。

static List string GetKeyWords(string q)

{

List string keyworkds = new List string

Analyzer analyzer = new SmartChineseAnalyzer(LuceneVersion.LUCENE_48);

using (var ts = analyzer.GetTokenStream(null, q))

{

ts.Reset;

var ct = ts.GetAttribute Lucene.Net.Analysis.TokenAttributes.ICharTermAttribute

while (ts.IncrementToken)

{

StringBuilder keyword = new StringBuilder;

for (int i = 0; i ct.Length; i++)

{

keyword.Append(ct.Buffer[i]);

}

string item = keyword.ToString;

if (!keyworkds.Contains(item))

{

keyworkds.Add(item);

}

}

}

return keyworkds;

}

分拆功能强大户键入的词句后,接下去应用 IndexSearcher 并应用组成标准开展检索:

static void Search(string q)

{

IndexReader reader = DirectoryReader.Open(FSDirectory.Open("Index_Data"));

var searcher = new IndexSearcher(reader);

var keyWordQuery = new BooleanQuery;

foreach (var item in GetKeyWords(q))

{

keyWordQuery.Add(new TermQuery(new Term("title", item)), Occur.SHOULD);

keyWordQuery.Add(new TermQuery(new Term("keyword", item)), Occur.SHOULD);

keyWordQuery.Add(new TermQuery(new Term("deion", item)), Occur.SHOULD);

}

var hits = searcher.Search(keyWordQuery, 200).ScoreDocs;

foreach (var hit in hits)

{

var document = searcher.Doc(hit.Doc);

Console.WriteLine("Url:{0}", document.Get("url"));

Console.WriteLine("Title:{0}", document.Get("title"));

Console.WriteLine("Keyword:{0}", document.Get("keyword"));

Console.WriteLine("Deion:{0}", document.Get("deion"));

}

}

接下去大家来尝试检索一下:

详细编码

这儿仅仅一个简易的实例,相关于大量,能够查询Lucene.Net的官方网文本文档。

using Lucene.Net.Analysis;

using Lucene.Net.Analysis.Cn.Smart;

using Lucene.Net.Documents;

using Lucene.Net.Index;

using Lucene.Net.Search;

using Lucene.Net.Store;

using Lucene.Net.Util;

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApp

{

class Program

{

static void Main(string[] args)

{

WriteDocument("https://zkea.net/index",

"纸壳CMS开源系统完全免费可视性化设计方案內容管理方法系统软件",

"纸壳CMS,ZKEACMS,可视性化设计方案,可视性化CMS",

"纸壳CMS(ZKEACMS)是开源系统的建网站系统软件,您能够立即应用它来作为您的公司网站,门户网网站或是本人网站,blog");

Search("可视性化CMS");

}

static void WriteDocument(string url, string title, string keywords, string deion)

{

using (var writer = GetIndexWriter)

{

writer.DeleteDocuments(new Term("url", url));

Document doc = new Document;

doc.Add(new StringField("url", url, Field.Store.YES));

TextField titleField = new TextField("title", title, Field.Store.YES);

titleField.Boost = 3F;

TextField keywordField = new TextField("keyword", keywords, Field.Store.YES);

keywordField.Boost = 2F;

TextField deionField = new TextField("deion", deion, Field.Store.YES);

deionField.Boost = 1F;

doc.Add(titleField);

doc.Add(keywordField);

doc.Add(deionField);

writer.AddDocument(doc);

writer.Flush(triggerMerge: true, applyAllDeletes: true);

writer.Commit;

}

}

static IndexWriter GetIndexWriter

{

var dir = FSDirectory.Open("Index_Data");

Analyzer analyzer = new SmartChineseAnalyzer(LuceneVersion.LUCENE_48);

var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);

IndexWriter writer = new IndexWriter(dir, indexConfig);

return writer;

}

static List string GetKeyWords(string q)

{

List string keyworkds = new List string

Analyzer analyzer = new SmartChineseAnalyzer(LuceneVersion.LUCENE_48);

using (var ts = analyzer.GetTokenStream(null, q))

{

ts.Reset;

var ct = ts.GetAttribute Lucene.Net.Analysis.TokenAttributes.ICharTermAttribute

while (ts.IncrementToken)

{

StringBuilder keyword = new StringBuilder;

for (int i = 0; i ct.Length; i++)

{

keyword.Append(ct.Buffer[i]);

}

string item = keyword.ToString;

if (!keyworkds.Contains(item))

{

keyworkds.Add(item);

}

}

}

return keyworkds;

}

static void Search(string q)

{

IndexReader reader = DirectoryReader.Open(FSDirectory.Open("Index_Data"));

var searcher = new IndexSearcher(reader);

var keyWordQuery = new BooleanQuery;

foreach (var item in GetKeyWords(q))

{

keyWordQuery.Add(new TermQuery(new Term("title", item)), Occur.SHOULD);

keyWordQuery.Add(new TermQuery(new Term("keyword", item)), Occur.SHOULD);

keyWordQuery.Add(new TermQuery(new Term("deion", item)), Occur.SHOULD);

}

var hits = searcher.Search(keyWordQuery, 200).ScoreDocs;

foreach (var hit in hits)

{

var document = searcher.Doc(hit.Doc);

Console.WriteLine("Url:{0}", document.Get("url"));

Console.WriteLine("Title:{0}", document.Get("title"));

Console.WriteLine("Keyword:{0}", document.Get("keyword"));

Console.WriteLine("Deion:{0}", document.Get("deion"));

}

}

}

}

出處:http://zkea.net/codesnippet/detail/lucene-net.html

著作权声明:文中来源于于网民搜集或网民出示,假如有侵权行为,请转达论坛版主或是留言板留言,本微信公众号马上删掉。回到凡科,查询大量

义务编写:

  • 企业网站建设第一步:网

    模拟题目:公司企业网站建设第一步:域名的剖析和关系方法 购买了域名和房间内室内空间之后,要如何运用具体实际操作,对于域名,务必进行剖析,对于房间内室内空间,务必关系

  • 组一个通讯卫星通讯网要

    原题目:组一个通讯卫星通讯网要两步?最先你得读这一手册 建立通讯卫星通讯网和设定、应用通讯卫星地球上站审核服务手册(详版) 服务手册序号:04030 建立通讯卫星通讯网和设

  • 公司企业网站建设常见的

    模拟题目:企业公司企业网站建设普遍的八个标准 以前,企业基建项目网站只高度重视网站的呈现,关注视觉效果实际效果具体实际效果,而实际上的营销推广营销推广性则太弱。企业

  • 怎样用指令查询自身的公

    自己描述 职位:IT 淘宝网网小店铺:p> 这一难点很早以前之前以前便会有想过,但是一直都没去尝试,今天又想起来,就想把它搞弄清楚,查询了在网络上好多好多的原材料,竟然没有

  • Google免收录?4个流程将你

    模拟题目:Google免交录?4个步骤将你的URL提交给Google 怎样才可让Google快速百度搜索百度收录和搜索到你的网站呢?十分简易的一个方法就是将你的网址提交给Google。 那般,你也便是在