如何用C#实现数据库全文检索

如何用C#实现数据库全文检索,第1张

目前行业网站的全文检索的方式主要有两种

方式一:通过数据库自带的全文索引

方式二:通过程序来自建全文索引系统

以sql server 2005为例

2005本身就自带全文索引功能,你可以先对数据库表

建立索引,具体如何建索引网上搜索一下,建立完索引之后,你就可以用sql来实现检索功能,例如:select * from ytbxw where

contaiins(字段,' 中国')多个查询值之间可以用and 或

or来实现,在单表以及单表视图上建全文索引对2005来说根本不是问题,但在多表视图建全文索引2005目前还无法实现这个功能,拿

www.ytbxw.com为例,其每个栏目的信息都是分开存放的,所以在检索上就无法用该方法来解决这个问题.

下面重点说一下如何用程序来实现检索功能

如果你想自己开发一个全文检索系统,我想这是相当复杂事情,要想实现也不是那么容易的事情,所以在这里我推荐一套开源程序,那就是dotlucene,我想大家可能都听过这个东东吧,那我就讲讲如何来实现多表情况下的全文检索.

1、新建winform项目,把lucene.net.dll添加到该项目中来

2、创建一个类,类名可以自己取

public class indexer

{

private indexwriter writer

 //在指定路径下创建索引文件

public indexer(string directory)

{

writer = new indexwriter(directory, new standardanalyzer(), true)

writer.setusecompoundfile(true)

}

 //将信息添加到索引文件中

/*

field.text:为索引+读取

field.unindexed:不需要做索引

*/

public void addhtmldocument(string path,string title,string content)

{

document doc = new document()

doc.add(field.text("text", content))

doc.add(field.unindexed("path", path))

doc.add(field.text("title", title))

writer.adddocument(doc)

}

//解析html,过滤html代码

private string parsehtml(string html)

{

string temp = regex.replace(html, "<[^>]*>", "")

return temp.replace(" ", " ")

}

//从页面中获取文章标题

private string gettitle(string html)

{

match m = regex.match(html, "<title>(.*)</title>")

if (m.groups.count == 2)

return m.groups[1].value

return "(unknown)"

}

//添加新闻到索引

public void addnews()

{

//从数据库获取记录(这部分略过)

for (int i = 1i <= pagesizei++)

{

rootid = int.parse(dr["classid"].tostring().substring(0, 2))

// 写入索引

addhtmldocument(http://www.ytbxw.com + dr["id"].tostring() + ".html",

dr["title"].tostring(), parsehtml(dr["content"].tostring()))

}/info/

}

//关闭索引

public void close()

{

writer.optimize()

writer.close()

}

}

Solr 是一个可供企业使用的 基于 Lucene 的开箱即用的搜索服务器 对Lucene不熟?那么建议先看看下面两篇文档

实战Lucene 第 部分 初识 Lucene lo lucene /

用Lucene加速Web搜索应用程序的开发 lucene /

一 solr介绍

solr是基于Lucene Java搜索库的企业级全文搜索引擎 目前是apache的一个项目 它的官方网址在 solr需要运行在一个servlet 容器里 例如tomcat solr在lucene的上层提供了一个基于HTTP/XML的Web Services 我们的应用需要通过这个服务与solr进行交互

二 solr安装和配置

关于solr的安装和配置 这里也有两篇非常好的文档 作者同时也是 Lucene Java 项目的提交人和发言人

使用Apache Solr实现更加灵巧的搜索 solr /l

solr /l

下面主要说说需要注意的地方

Solr的安装非常简单 下载solr的zip包后解压缩将dist目录下的war文件改名为solr war直接复制到tomcat 的webapps目录即可 注意一定要设置solr的主位置 有三种方法 我采用的是在tomcat里配置java p/env/solr/home的一个JNDI指向solr的主目录(example目录下) 建立/tomcat /conf/Catalina/localhost/solr xml文件

<Context docBase= D:/solr war debug= crossContext= true ><Environment name= solr/home type= java lang String value= D:/solr/solr override= true /></Context>

观察这个指定的solr主位置 里面存在两个文件夹 conf和data 其中conf里存放了对solr而言最为重要的两个配置文件schema xml和solrconfig xml data则用于存放索引文件

schema xml主要包括types fields和其他的一些缺省设置

solrconfig xml用来配置Solr的一些系统属性 例如与索引和查询处理有关的一些常见的配置选项 以及缓存 扩展等等

上面的文档对这两个文件有比较详细的说明 非常容易上手 注意到schema xml里有一个

<uniqueKey>url</uniqueKey>

的配置 这里将url字段作为索引文档的唯一标识符 非常重要

三 加入中文分词

对全文检索而言 中文分词非常的重要 这里采用了qieqie庖丁分词(非常不错 )) 集成非常的容易 我下载的是 alpha 版本 其中它支持最多切分和按最大切分 创建自己的一个中文TokenizerFactory继承自solr的BaseTokenizerFactory

/** * Created by IntelliJ IDEA * User: ronghao * Date: * Time: : : * 中文切词 对庖丁切词的封装 */ public class ChineseTokenizerFactory extends BaseTokenizerFactory { /** * 最多切分 默认模式 */ public static final String MOST_WORDS_MODE = most words /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = max word length private String mode = nullpublic void setMode(String mode) { if (mode==null||MOST_WORDS_MODE equalsIgnoreCase(mode) || default equalsIgnoreCase(mode)) { this mode=MOST_WORDS_MODE} else if (MAX_WORD_LENGTH_MODE equalsIgnoreCase(mode)) { this mode=MAX_WORD_LENGTH_MODE} else { throw new IllegalArgumentException( 不合法的分析器Mode 参数设置: + mode)} } @Override public void init(Map args) { super init(args)setMode(args get( mode ))} public TokenStream create(Reader input) { return new PaodingTokenizer(input PaodingMaker make() createTokenCollector())} private TokenCollector createTokenCollector() { if( MOST_WORDS_MODE equals(mode)) return new MostWordsTokenCollector()if( MAX_WORD_LENGTH_MODE equals(mode)) return new MaxWordLengthTokenCollector()throw new Error( never happened )} }

在schema xml的字段text配置里加入该分词器

<fieldtype name= text class= solr TextField positionIncrementGap= >

<*** yzer type= index >

<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words />          <filter class= solr StopFilterFactory ignoreCase= true words= stopwords txt />

<filter class= solr WordDelimiterFilterFactory generateWordParts= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />

<filter class= solr LowerCaseFilterFactory />

<filter class= solr RemoveDuplicatesTokenFilterFactory />

</ *** yzer>

<*** yzer type= query >

<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words />  

<filter class= solr SynonymFilterFactory synonyms= synonyms txt ignoreCase= true expand= true />

<filter class= solr StopFilterFactory ignoreCase= true words= stopwords txt />

<filter class= solr WordDelimiterFilterFactory generateWordParts= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />

<filter class= solr LowerCaseFilterFactory />

<filter class= solr RemoveDuplicatesTokenFilterFactory />

</ *** yzer>

</fieldtype>

完成后重启tomcat 即可在

体验到庖丁的中文分词 注意要将paoding *** ysis jar复制到solr的lib下 注意修改jar包里字典的home

四 与自己应用进行集成

Solr安装完毕 现在可以将自己的应用与solr集成 其实过程非常的简单 应用增加数据——>根据配置的字段构建add的xml文档——>post至solr/update

应用删除数据à根据配置的索引文档唯一标识符构建delete的xml文档——>post至solr/update

检索数据à构建查询xml—>get至/solr/select/——>对solr返回的xml进行处理——>页面展现

具体的xml格式可以在solr网站找到 另外就是solr支持高亮显示 非常方便

关于中文 solr内核支持UTF 编码 所以在tomcat里的server xml需要进行配置

<Connector port= maxHttpHeaderSize= URIEncoding= UTF …/>

另外 向solr Post请求的时候需要转为utf 编码 对solr 返回的查询结果也需要进行一次utf 的转码 检索数据时对查询的关键字也需要转码 然后用 + 连接

String[] array = StringUtils split(query null )for (String str : array) { result = result + URLEncoder encode(str UTF ) + + }

lishixinzhi/Article/program/Java/hx/201311/25984


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11659174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存