全文搜索是怎么实现的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全文搜索是怎么实现的?相关的知识,希望对你有一定的参考价值。

我在进行网站设计,很长的文章怎么存到数据库?使用SQL数据库可以实现吗?还想要用关键词进行搜索,不知怎么实现全文检索?

要实现全文检索需要2个必要的条件:一是需要将最终信息本身输入到计算机里,这个问题看似简单,实际上它包含了极大的工作量;二是需要有相应的软件支持,全文信息不仅包括书刊的文字信息,而且包括图片、声音、视频信息等各种信息资料,即使只将书刊及各种资料的文字信息输入计算机,其信息量就非常大了。

全文检索目前主要通过以下方式来实现:
①采用自由指定的检索项(如关键词、字符串等)直接与全文文本的一次数据高速对照,进行检索;
②对文本内容中的每个检索项进行位置扫描,然后排序,建立以每个检索项的离散码为表目的倒排文档;
③采用超文本模型建立全文数据库,实现超文本检索。
参考技术A 很长的文章怎么存到数据库
不要存到数据库直接存成文本文件就可以还很安全。
使用SQL数据库可以实现吗?
可以只不过载入非常慢,也可以把文章分成几块,只不过程序很复杂。
还想要用关键词进行搜索,不知怎么实现全文检索?
<%
Response.Buffer=True

Const ValidFiles = "htmltxt"
Const RootFld = "./"

Dim Matched
Dim Regex
Dim GetTitle
Dim fs
Dim rfLen
dim RootFolder
Dim DocCount
Dim DocMatchCount
Dim MatchedCount

' ----------------------------------------------
' Procedure: SearchFiles()
' ----------------------------------------------
Public Sub SearchFiles(FolderPath)
Dim fsFolder
Dim fsFolder2
Dim fsFile
Dim fsText
Dim FileText
Dim FileTitle
Dim FileTitleMatch
Dim MatchCount
Dim OutputLine

' Get the starting folder
Set fsFolder = fs.GetFolder(FolderPath)
' Iterate thru every file in the folder
For Each fsFile In fsFolder.Files
' Compare the current file extension with the list of valid target files
If InStr(1, ValidFiles, Right(fsFile.Name, 3), vbTextCompare) > 0 Then
DocCount = DocCount + 1
' Open the file to read its content
Set fsText = fsFile.OpenAsTextStream
FileText = fsText.ReadAll
' Apply the regex search and get the count of matches found
MatchCount = Regex.Execute(FileText).Count
MatchedCount = MatchedCount + MatchCount
If MatchCount > 0 Then
DocMatchCount = DocMatchCount + 1
' Apply another regex to get the html document's title
Set FileTitleMatch = GetTitle.Execute(FileText)
If FileTitleMatch.Count > 0 Then
' Strip the title tags
FileTitle = Trim(replace(Mid(FileTitleMatch.Item(0),8),"</title>","",1,1,1))
' In case the title is empty
If FileTitle = "" Then
FileTitle = "No Title (" & fsFile.Name & ")"
End If
Else
' Create an alternate entry name (if no title found)
FileTitle = "No Title (" & fsFile.Name & ")"
End If
' Create the entry line with proper formatting
' Add the entry number
OutputLine = " <b>" & DocMatchCount & ".</B> "
' Add the document name and link
OutputLine = OutputLine & "<A href=" & chr(34) & RootFld & replace(Mid(fsFile.Path,
rfLen),"\","/") & chr(34) & "><B>"
OutputLine = OutputLine & FileTitle & "</B></a>"
' Add the document information
OutputLine = OutputLine & "<font size=1><br> Criteria matched " & MatchCount
& " times - Size: "
OutputLine = OutputLine & FormatNumber(fsFile.Size / 1024,2 ,-1,0,-1) & "K bytes"
OutputLine = OutputLine & " - Last Modified: " & formatdatetime
(fsFile.DateLastModified,vbShortDate) & "</Font><br>"
' Display entry
Response.Write OutputLine
Response.Flush
End If
fsText.Close
End If
Next

' Iterate thru each subfolder and recursively call this procedure
For Each fsFolder2 In fsFolder.SubFolders
SearchFiles fsFolder2.Path
Next

Set FileTitleMatch = Nothing
Set fsText = Nothing
Set fsFile = Nothing
Set fsFolder2 = Nothing
Set fsFolder = Nothing
End Sub

' ----------------------------------------------
' Procedure: Search()
' ----------------------------------------------
Sub Search(SearchString)
Dim i
Dim fKeys
Dim fItems

Set fs = CreateObject("Scripting.FileSystemObject")
Set GetTitle = New RegExp
Set Regex = New RegExp

With Regex
.Global = True
.IgnoreCase = True
.Pattern = Trim(SearchString)
End With
With GetTitle
.Global = False
.IgnoreCase = True
.Pattern = "<title>(.|\n)*</title>"
End With

RootFolder = Server.MapPath(RootFld)

If Right(RootFld,1) <> "/" Then
RootFld = RootFld & "/"
End If

If Right(RootFolder, 1) <> "\" Then
RootFolder = RootFolder & "\"
End If
rfLen = Len(RootFolder) + 1

SearchFiles RootFolder

If MatchedCount = 0 Then
Response.Write " <B>No Matches Found.</b><BR>"
End If

Set Regex = Nothing
Set GetTitle = Nothing
Set fs = Nothing

End Sub

%>
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta http-equiv="Content-Language" content="en-us">
<TITLE>OneFile Search 1.0</TITLE>
</HEAD>
<body bgcolor="#FFFFFF" link="#660000" vlink="#008000">
<Font Face="Tahoma,Arial" Size="2">
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%" colspan="2"></td>
</tr>
<tr>
<td width="50%" bgcolor="#000000">
<Form method="Get">
<table border="0" width="100%">
<tr>
<td width="33%" align="right"><font color="#FFFFFF" size="2" face="Tahoma,Arial"><b>Search
for </b></font></td>
<td width="33%"><input type="text" size="20" value="<%=Request.QueryString("query")%>"
name="query"></td>
<td width="34%"><input type="submit" name="Search" Value="Search"></td>
</tr>
</table>
</Form>
</td>
<td width="50%" bgcolor="#000000"></td>
</tr>
<tr>
<td width="100%" colspan="2" bgcolor="#000000"></td>
</tr>
<tr>
<td width="50%" bgcolor="#808080">
<table border="0" width="100%">
<tr>
<td width="33%" align="right"><font face="Tahoma,Arial" size="1"
color="#FFFFFF"><b>Tip:</b></font></td>
<td width="67%"><font color="#FFFFFF" face="Tahoma,Arial" size="1">Search by using <a
href="http://msdn.microsoft.com/scripting/default.htm?/scripting/VBScript/doc/jsgrpregexpsyntax.htm">Regula
r Expresions</a>.</font></td>
</tr>
</table>
</td>
<td width="50%" bgcolor="#808080"></td>
</tr>
</table>

<%
If Trim(Request.QueryString("query")) <> "" Then
%>
<hr>
<table border="0" width="100%" bgcolor="#808080" cellspacing="0" cellpadding="0">
<tr>
<td width="100%"><Font Color="#FFFFFF" Size="2"> Your search for <B><%
=Request.QueryString("query")%></B> found the following documents:</Font></td>
</tr>
</table>
<BR><BR>
<%
Response.Flush
Search Request.QueryString("query")
If DocCount > 0 Then
%>
<BR>
<Font Size=1>
(The search criteria "<%=Request.QueryString("query")%>" found <%=MatchedCount%> times in <%
=DocMatchCount%> of <%=DocCount%> documents.)
</font>
<%
End If
End If
%>
<BR><BR>
<hr><div align="center">
<Font size=1>
OneFile Search Engine v1.0<br>
Copyright?000 <a href="mailto:sixtos@prtc.net">Sixto Luis Santos</a>.
All Rights Reserved
</Font></div>

</Font>
</body>
</html>

<%
Response.End
%>
给个想法具体细节根据自己的网站定
参考技术B 。。。很长的文章也只能放在数据库阿,要不然放那里阿。。。关键词你在使用SQL语句的时候用%X%就可以了,直接搜索文章内容这个字段就OK了吧

不知道你问的是不是这个。。。

oracle数据库实现全文检索

像这样网站的全文搜索是怎么实现的,新手,越详细越好,谢谢!

Oracle全文检索配置方法:

1.检查数据库是否具有全文检索功能(这是针对已经建成使用的数据库)

查看用户中是否存在ctxsys用户,查询角色里是否存在ctxapp角色。以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。

使用contains函数的时候,若没有全文检索则会报错的。

2.若没有,则需要手动建立,先建立全文检索要使用的空间

sqlplus / as sysdba  --进入控制台

create tablespace Idx_ctxsys datafile \'/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间

3.创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql

还是在sqlplus中执行:

@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock

在执行这个脚本的时候,输入了几个参数,第一个参数ctxsys为ctxsys用户的密码

第二个参数Idx_ctxsys为ctxsys用户要使用的表空间

第三个参数temp为ctxsys用户使用的临时表空间

第四个参数nolock为ctxsys用户处于解锁状态。

4.创建完成后,要登录ctxsys用户

connect ctxsys/ctxsys

执行以下脚本:@?/ctx/admin/defaults/drdefus.sql(这是个很重要的脚本,后面创建索引会使用该脚本创建的信息)

5.创建全文索引语法分析器

先要明确使用全文索引的用户,我要使用全文索引的是sgpm用户

因此

grant execute on ctxsys.ctx_ddl to sgpm with grant option;

connect sgpm/sgpm

设置语法分析器:

exec ctx_ddl.drop_preference(\'chinalexer\');
exec ctx_ddl.create_preference(\'chinalexer\',\'chinese_lexer\');

设置词法属性:

exec ctx_ddl.drop_preference(\'idx_c_store\');begin
ctx_ddl.create_preference(\'idx_c_store\',\'BASIC_STORAGE\');
ctx_ddl.set_attribut(\'idx_c_store\',\'I_TABLE_CLAUSE\',\'tablespaces  Idx_ctxsy\');
ctx_ddl.set_attribute(\'idx_c_store\',\'I_INDEX_CLAUSE\',\'tablespace  Idx_ctxsy compress 2\');
end;
/

6.创建索引

create index sgpm.idx_c_cons_name on sgpm.c_cons(cons_name) indextype is ctxsys.context parameters(\'lexer chinalexer storage idx_c_store\');

7.同步索引

variable jobno number;
begin
dbms_job.submit(:jobno,\'pkg_sp_tools.p_cont_sys_index();\',sysdate,\'trunc(sysdate)+19/24+1\');  --执行的是个性化方法。
end;
/

普通的就是用: 

exec ctx_ddl.sync_index(\'idx_c_cons_name\');

到此,全文检索创建成功,contains函数就可以正常使用了。

注意:创建的过程中会出现ORA-29879:cannot create multiple domain index on a column listusing same indextype ,这说明在其他用户下已经建立了该索引。

参考技术A 这个一般是用java做的,90%是用的lucene的搜索引擎技术为主的垂直搜索引擎。比如著名的百度
google等等,门户搜索引擎网站都是用的这个技术。你说的数据库和这个相比在压力以及搜索速度上有一定的差距,数据库毕竟是一款软件,承载量以及大数据的添查删改都是要有搜索时间的,十分讲究存储结构。但是lucene却并没有这样的问题,它的数据是基于网络爬虫来搜索数据的,而不是存储数据在一个数据库中。这其中又涉及到seo优化,优先级排序算法等另一方面的引擎知识了。所以总的来说,lucene在全文检索比数据库的搜索能力强上很多,专业的事情让专业的来做,数据库还是去用作生产的实时数据库和数据仓库来进行报表和决策分析吧!
参考技术B 那个一般是使用开源的检索组件,当然Oracle的全文检索也是可以的,这个网上太多啦,你搜搜看

以上是关于全文搜索是怎么实现的?的主要内容,如果未能解决你的问题,请参考以下文章

Lucene及全文搜索实现原理

这是一篇全文搜索教程:微服务框架SpringBoot整合ElasticSearch实现全文搜索

使用haystack实现Django的全文搜索 -- Elasticsearch搜索引擎

Lucene全文搜索原理与使用

怎么MySql添加全文索引

Mysql+Sphinx实现全文搜索