之前使用一直是没有问题的,只到今天发现删除的时候无法删除,增加的时候却一直在增加,导致搜索的时候可以搜出来很多相同的结果。

小猪决定趁今天这个机会好好的把这个问题给解决了。

private void ProcessJobs(IndexWriter writer)
{
while (jobs.Count != )
{
IndexJob job = jobs.Dequeue();
writer.DeleteDocuments(new Term("Id", job.Id.ToString()));//先执行删除的操作
//如果“添加文章”任务再添加,
if (job.JobType == JobType.Add)
{
BLL.BooksManage bll = new BLL.BooksManage();
Entity.Books art = bll.GetById(job.Id);
if (art == null)//有可能刚添加就被删除了
{
continue;
} //string channel_id = art.channel_id.ToString();
string title = art.Title;
DateTime time = art.CreateDate;
string content = Utils.DropHTML(art.Brief.ToString());
string Addtime = art.CreateDate.ToString("yyyy-MM-dd"); Document document = new Document();
//只有对需要全文检索的字段才ANALYZED
document.Add(new Field("Id", job.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Title", title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Tag", art.Tag, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("PubTime", art.PubTime.ToString("yyyy-MM-dd"), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Cover", art.Cover, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Author", art.Author == null ? "" : art.Author, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Translator", art.Translator == null ? "" : art.Translator, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Publisher", art.Publisher == null ? "" : art.Publisher, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Language", art.Language, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Brief", Utils.DropHTML(art.Brief.ToString()), Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Icon", art.Icon, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Rate", art.Rate.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Price", art.Price.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Device", art.Device, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("EngineVersion", art.EngineVersion.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("ContentType", art.ContentType, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Size", art.Size.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Status", art.Status.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Other2", art.Other2, Field.Store.YES, Field.Index.ANALYZED));
writer.AddDocument(document);
logger.Debug("索引" + job.Id + "完毕");
}
else
{ } }
}

之前小猪还在想为什么这里没有处理删除的逻辑,仔细看了下发现只要增加了任务不管是删除还是添加都会先执行删除操作以防止索引结果的重复。问题就出现在这里,依照什么规则来删除呢?之前小猪直接用的别人的代码,今天才发现需要自己定义删除的规则:

writer.DeleteDocuments(new Term("number", job.Id.ToString()))

另外就是要处理好啥时候删除,啥时候增加的逻辑。不然很容易出现各种问题,例如数据库中没有而索引里有的,或者数据库里有的但是不可用的但是搜索出来的等等等等~~

使用Lucene.Net管理索引实现搜索的更多相关文章

  1. lucene简介 创建索引和搜索初步

    lucene简介 创建索引和搜索初步 一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引 ...

  2. 搜索引擎系列 ---lucene简介 创建索引和搜索初步

    一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子 ...

  3. Lucene第二讲——索引与搜索

    一.Feild域 1.Field域的属性 是否分词:Tokenized 是:对该field存储的内容进行分词,分词的目的,就是为了索引. 否:不需要对field存储的内容进行分词,不分词,不代表不索引 ...

  4. Lucene.net 从创建索引到搜索的代码范例

    关于Lucene.Net的介绍网上已经很多了在这里就不多介绍Lucene.Net主要分为建立索引,维护索引和搜索索引Field.Store的作用是通过全文检查就能返回对应的内容,而不必再通过id去DB ...

  5. JAVAEE——Solr:安装及配置、后台管理索引库、 使用SolrJ管理索引库、仿京东的电商搜索案例实现

    1 学习回顾 1. Lucene  是Apache开源的全文检索的工具包 创建索引 查询索引 2. 遇到问题? 文件名 及文件内容  顺序扫描法  全文检索 3. 什么是全文检索? 这种先创建索引 再 ...

  6. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.ƒDirectory.ƒAnalyzer.ƒDocument.ƒField 1.IndexWriter IndexWr ...

  7. lucene索引并搜索mysql数据库[转]

    由于对lucene比较感兴趣,本人在网上找了点资料,终于成功地用lucene对mysql数据库进行索引创建并成功搜索,先总结如下: 首先介绍一个jdbc工具类,用于得到Connection对象: im ...

  8. Lucene中最简单的索引和搜索示例

    package com.jiaoyiping.lucene; import org.apache.lucene.analysis.standard.StandardAnalyzer; import o ...

  9. 用Lucene.net对数据库建立索引及搜索<转>

    用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...

随机推荐

  1. 【Todo】OSGi学习

    经常听到.见到OSGi这个名字.那么就单开一篇文章记录一下对OSGi的学习吧. 主要是做一些概念上面的学习.暂时不打算深入实践. 主要参考:http://www.osgi.com.cn/article ...

  2. [js] 非常好的面试题,学习了。。

    原文链接:http://www.cnblogs.com/xxcanghai/p/5189353.html

  3. Android布局_相对布局RelativeLayout

    一.RelativeLayout(相对布局)概述 RelativeLayout是相对布局控件,它包含的子控件将以控件之间的相对位置或者子类控件相对父类容器的位置的方式排列 二.RelativeLayo ...

  4. Java.util.concurrent包学习(一) BlockingQueue接口

    JDK1.7 BlockingQueue<E>接口 (extends Queue<E>) 所有父接口:Collection<E>,Iterable<E> ...

  5. Mysql 组合查询 UNION 与 UNION ALL

  6. Windows不重启就使环境变量修改生效

    以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口.再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属 ...

  7. Windows Server 2012 (2008) 忘记密码重置方法 Windows 10 忘记密码

    要使用windows server 2012安装DVD,选择光盘引导进入 进入修复系统---命令提示符---切换目录至系统目录--执行move命令    先备份  utilman.exe(他就是这个程 ...

  8. dedecms 模板文件不存在,无法解析文档"的终极各种解决办法

    方法一:[此对应喜欢把模板文件使用".html"的格式,]  /include/arc.archives.class.php 556行    if (!preg_match(&qu ...

  9. css读书笔记1:HTML标记和文档结构

    块级元素和行内元素:块级元素:上下堆叠,每个块级元素都独立占一行.块级元素的盒子宽度与父元素同宽.行内元素:左右堆叠,只有在空间不足的情况下才会折到下一行显示.行内元素的盒子会收缩包裹其内容,并尽可能 ...

  10. Form1和Form2的交互

    比如在第二个窗体中操作第一个窗体中的TreeView,动态添加节点和子节点. ------回答--------- ------其他回答(20分)--------- 尽量不要这样做.控件,窗体,你在.n ...