问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-07 20:29

我来回答

2个回答

懂视网 时间:2022-04-08 00:50

ID以外,更多的是依靠全文检索来实现的。

    目前我们有很多流程,主要工作方式是:启动时,从主数据中获取相应的数据变成交易数据,经过流程各环节的处理,流程结束时,交易数据再写回到主数据中。在这个过程中,除了流程之外,查询交易数据的机会很少(全文检索除外)。因此,为过程中大量的交易数据进行数据库设计的意义就不是很大了。

    除主键RESOURCE_ID外,最关键的是XML_CONTENT字段,它以xml数据类型保存了业务实体的内容。之所以使用xml类型而不是二进制或纯字符串类型,是保留了为xml字段中的内容创建索引的可能性。

     仅仅有表结构还不够。为了大家使用方便,我们设计了针对于此数据结构的数据实体和数据访问适配器(Adapter)。此外,我们还定义了一组Attribute,帮助大家将对象转换成xml格式。.NetFramework的xml序列化机制由于要用到动态编译,所以我们轻易不用。

   我们看看这个数据实体的基类的定义:

[Serializable]
[XmlRootMapping("GenericFormData")]
[XElementSerializable]
[ORTableMapping("WF.GENERIC_FORM_DATA")]
[ObjectCompare("ID")]
public class GenericFormData : WorkflowObjectBase
{
	[Description("编号")]
	[XmlObjectMapping]
	[ORFieldMapping("RESOURCE_ID", PrimaryKey = true)]
	public override string ID { get; set; }
 
	[Description("标题")]
	[XmlObjectMapping]
	[ORFieldMapping("SUBJECT")]
	[StringLengthValidator(1, 255, MessageTemplate = "请填写标题,且长度必须小于255个字符")]
	public override string Subject { get; set; }
 
	private IUser _Creator = null;
 
	[SubClassORFieldMapping("ID", "CREATOR_ID", IsNullable = false)]
	[SubClassORFieldMapping("DisplayName", "CREATOR_NAME", IsNullable = false)]
	[SubClassType(typeof(OguUser))]
	public virtual IUser Creator
	{
		get
		{
			return this._Creator;
		}
		set
		{
			this._Creator = (IUser)OguBase.CreateWrapperObject(value);
		}
	}
 
	[Description("创建时间")]
	[XmlObjectMapping]
	[ORFieldMapping("CREATE_TIME")]
	[SqlBehavior(BindingFlags = ClauseBindingFlags.All, DefaultExpression = "getdate()")]
	public virtual DateTime CreateTime { get; set; }
 
	[Description("XML")]
	[ORFieldMapping("XML_CONTENT")]
	public virtual string XmlContent { get; set; }
	 
	[ORFieldMapping("SEARCH_CONTENT")]
	[Description("搜索内容")]
	public virtual string SearchContent { get; set; }
}

    可以看出,它和一般的数据实体类差别不大,只不过上面有XmlRootMapping,XmlObjectMapping等几个属性用来帮助将对象序列化为xml。

     如果我们想将GenericFormData序列化为xml,只需要调用XmlHelper.SerializeObjectToXml(data)即可。

我们想使用的时候,只需要写一个从GenericFormData派生的数据实体,以及从GenericFormDataAdapterBase<T, TCollection>派生的Adapter类即可。

SampleFormData由于存储在xml字段中,在不创建索引的情况下,我们可以认为是非结构化的。在上面的例子中,它的子对象集合SubData也是非结构化的。在实际的应用场景中,子对象不一定也是非结构化的,例如表单的意见、附件等子对象。我们需要重载Adapter的BeforeInnerUpdate、AfterInnerUpdate或AfterLoad去处理子对象。

    有的时候,不一定需要同时加载主对象和子对象,例如列表中只会用到主对象,而表单往往同时使用主对象和子对象。

     在这种场景下,子对象往往是延迟加载的。

    最后需要注意的是,不是所有的对象都可以按照上面的Xml序列化机制来序列化的,尤其是对象交叉引用的情况,这种通用数据并不能象结构化数据那样容易检索。为了缓解这一不足,我们在GenericFormData和GenericFormRelativeData上都设置了一个SearchContent属性,这个属性会对应到数据库表上SEARCH_CONTENT的全文检索字段。

     应用可以将自己想查的文本数据放在SearchContent属性中,然后进行查询:

select *
from WF.GENERIC_FORM_RELATIVE_DATA
where CONTAINS(SEARCH_CONTENT, '123'); 




全文搜索的数据库及实体实现

标签:全文搜索

热心网友 时间:2022-04-07 21:58

目前行业网站的全文检索的方式主要有两种
方式一:通过数据库自带的全文索引
方式二:通过程序来自建全文索引系统
以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 = 1; i <= pagesize; i++)
{
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();
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谁告诉我一下,韩语中,“遵命”怎么说 想开个甜品店,不知道哪里可以学习呢 如何取消微信新号绑定的手机号? 翼支付-翼建钟情活动内容是什么? 怎么参加翼支付“翼建钟情”活动? 翼支付--翼建钟情立减10元-建行这次活动有具体名额限制吗? 西凤酒是哪里的 货车总重量不超过二十吨就不算超载吗? 自卸货车上装有二十多吨货已经有四五天了对货车能伤害哪个部位? 如何回复别人的"忙里偷闲"? 从社会的角度,人生价值的评价标准分哪两种? 六盘水到湖南娄底市怎么买火车票 人生的价值观有几种?谢谢! 重庆北至娄底火车票如何退票 人生价值观都有哪些 松江到娄底火车票22号预定 什么是人生价值? 玉米面和西葫芦鸡蛋烙饼长肉吗? 请问娄底高铁南站的客服电话是多少? 上海到湖南省娄底市怎么买火车票 娄底火车站到横市火车票 西葫芦鸡蛋烙饼怎么做 深圳坐火车去湖南娄底要多少钱?有坐位吗? 西葫芦烙饼的做法,西葫芦烙饼怎么做好吃,西葫 西葫芦烙饼的做法,西葫芦烙饼怎么做 曾志伟做的行车记录仪广告是什么牌子的多少钱一个 我家在湖南娄底的,现在在深圳可以买哪到哪的高铁票? 娄底到长沙火车站列车时刻表 一线明星代言的门窗有哪些 我刚到12306网站怎么没有看到常德到娄底的火车了?从娄底到常德还是有?怎么回事 ?求解答 人生价值的体现形式有多少种? 人生价值的认可有没有层次种类的区别? 人生价值观分为哪几种? 一、什么是人生价值?其包括的两个方面有什么关系?联系自己的实际谈谈对人生价 人生价值观有哪些 人的一生具有多少种人生价值? 【人生价值的标准】 一个人的人生价值观是什么 电脑上的王者荣耀跟手机不一样吗 为什么电脑版的王者荣耀跟手机版的区不同 手机王者荣耀和电脑王者荣耀有什么区别? 王者荣耀电脑版跟手机版的不一样吗 王者荣耀电脑版和手机版的是不是一样的 股票第二板放量好还是不好 王者荣耀电脑版和手机版一样吗? 一板进二板战法公式 王者荣耀电脑版怎么和手机的不一样 主角叫边南的校园耽美文 bl小说男主名字叫边南的 另一个忘了。 首板放量,二板放量,第三天高开选股公式?