这个过程通常被称为

information retrieval.你可能会发现

this online book有帮助.

现有图书馆

这里有两个现有的解决方案可以完全集成到一个应用程序中,而不需要单独的进程(我相信都会用VC编译).

Xapian是成熟的,可以做很多你需要的,从索引到排序检索.需要单独的HTML解析,因为AFAIK,它不解析html(它有一个配套程序Omega,它是索引网站的前端).

Lucene是Java中的索引/搜索Apache库,具有官方预发行版本C版本lucy和非官方C版本CLucene.

实施信息检索

如果上述选项由于某种原因不可行,请参阅构建和使用索引的各个步骤的一些信息.根据您的应用需求,定制解决方案可以从简单到复杂.我把这个过程分成5个步骤

> HTML处理

>文字处理

>索引

>检索

>排名

HTML处理

这里有两种方法

>剥离您引用的页面讨论了通常称为剥离的技术,其中涉及删除所有不会显示的HTML元素,并将其他元素转换为其显示形式.就个人而言,我将使用perl进行预处理,并对结果文本文件进行索引.但是,对于集成解决方案,特别是要记录重要性标签(例如< h1>< h2>)的解决方案,您可能希望自己的角色. Here is a partial implementation的C剥离程序(出现在C的思考,最终版本的here),你可以从中构建.

>解析从剥离的复杂性上升到html解析,这将有助于您记录重要性标签.但是,一个好的C HTML解析器是hard to find.一些选项可能是htmlcxx(从来没有使用,但是有活力,看起来很有前途)或hubbub(C库,NetSurf的一部分,但声称是可移植的).

如果您正在处理XHTML或愿意使用HTML到XML转换器,则可以使用许多可用的XML解析器之一.但是,再次,HTML到XML转换器很难找到,我唯一知道的是HTML Tidy.除了转换为XHTML,其主要目的是修复丢失/损坏的标签,而has an API可能用于将其集成到应用程序中.给定XHTML文档,有许多很好的XML解析器,例如Xerces-C++和tinyXML.

文字处理

至少对于英文来说,处理文字到字很简单.当涉及搜索时,有一些并发症.

>停止单词是先验而不是提供集合中的文档(例如文章和命题)之间的有用区别的单词.这些词通常不会从查询流中编入索引和过滤.网络上有很多停止列表,例如one.

> Stemming涉及预处理文档和查询,以确定每个单词的根,以更好地推广搜索.例如.寻找“foobarred”应该产生“foobarred”,“foobarring”和“foobar”.该索引可以单独构建和搜索.两种一般的干扰方法是基于字典(来自词==>根的查找)和基于算法.波特算法是非常普遍的,并且有几种实现可用,例如. C++ here或C here.在Snowball C library停留支持多种语言.

> Soundex encoding使搜索更加鲁棒的拼写错误的一种方法是使用语音编码对字进行编码.那么当查询语音错误时,他们仍然会直接映射到索引的单词. here’s one有很多实现.

索引

地图字==>页面数据结构被称为inverted index.它被反转,因为它经常从页面的前向索引生成==>话.反向索引通常有两种风格:反转文件索引,它们将每个文档映射到其中,并将完整的反向索引映射到每个文档中的每个位置.

重要的决定是后端用于索引,一些可能性是按照易于实现的顺序:

> SQLite或Berkly DB – 这两个都是具有集成到项目中的C API的数据库引擎,而不需要单独的服务器进程.持久性数据库基本上是文件,因此可以通过更改关联的文件来搜索多个索引集.使用DBMS作为后端可简化索引创建,更新和搜索.

>在内存数据结构中 – 如果您使用的反向文件索引不是太大(内存消耗和加载时间),则可以以std :: map< std :: string,word_data_class&gt ;,将boost::serialization用于持久性.

>在磁盘数据结构 – 我听说过使用内存映射文件这种事情,YMMV惊人的快速结果.具有反向文件索引将涉及到两个索引文件,一个表示与struct {char word [n]等字的单词; unsigned int offset; unsigned int count; },第二个表示(word,document)的元组只有unsigned int(在文件偏移量中隐含的单词).偏移量是第二个文件中单词的第一个文档ID的文件偏移量,count是与该单词相关联的文档ID数量(从第二个文件读取的ids的数量).然后,搜索将通过指向内存映射文件的指针减少到通过第一个文件的二进制搜索.缺点是需要填充/缩短单词以获得一个恒定的记录大小.

索引的过程取决于您使用的后端.用于生成反转文件索引(detailed here)的经典算法从阅读每个文档开始,并扩展(页面ID,字)元组的列表,忽略每个文档中的重复单词.处理所有文档后,按字排序列表,然后折叠为(word,(页面id1,页面id2,…)).

mifluz gnu库实现具有存储的倒排索引,但没有文档或查询解析. GPL,因此可能不是一个可行的选择,但会让您了解支持大量文档的反向索引所涉及的复杂性.

恢复

一个非常常见的方法是布尔检索,它只是分别用于或者分别连接到每个查询词的索引文档的联合/交集.如果文档ID按照每个术语的排序顺序存储,这些操作是有效的,因此可以直接应用std :: set_union或std :: set_intersection等算法.

检索有差异,wikipedia有一个概述,但是标准布尔对许多/大多数应用是有好处的.

排行

对布尔检索返回的文档进行排序有很多种方法.常用的方法是基于单词模型,这仅仅意味着词的相对位置被忽略.一般的方法是对每个检索到的文档相对于查询进行评分,并根据其计算得分对文档进行排名.有很多评分方法,但是起始的地方就是频率逆文档频率公式.

这个公式背后的想法是,如果一个查询词频繁出现在一个文档中,该文档应该得分更高,但是在许多文档中发生的一个词语的信息量较少,因此这个词应该被加权.公式是,超过查询词i = 1..N和文档j

score [j] = sum_over_i(word_freq [i,j] * inv_doc_freq [i])

其中word_freq [i,j]是文档j中单词i的出现次数,

inv_doc_freq [i] = log(M / doc_freq [i])

其中M是文档的数量,doc_freq [i]是包含单词i的文档数量.请注意,所有文件中出现的单词都不会对分数做出贡献.广泛使用的更复杂的得分模型是BM25,包括Lucene和Xapian.

通常情况下,通过反复调整可以获得特定领域的有效排名.通过标题/段落上下文来调整排名的起始位置可能会使基于标题/段落上下文的单词的word_freq膨胀. 1段,10级为顶级标题.对于其他一些想法,您可能会发现this paper有趣,作者调整了BM25排名的位置得分(这个想法是更接近文档开头的词语比结束语更相关).

详细here,精确回忆曲线或平均精度得出了目标量化排序性能.评估需要一组理想的查询组合与集合中的所有相关文档.

html怎么做搜索框索引,创建并使用HTML全文搜索索引(C)相关推荐

  1. html 搜索框 自动补全,自动完成的搜索框javascript实现

    自动完成的搜索框javascript实现 2019-01-04 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了自动完成的搜索框javascript实现,编程之家 ...

  2. html打开微信搜索页,微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)...

    上效果图: 一:搜索框功能实现 1.在首页做一个搜索框的样式并实现跳转到搜索页面 搜索 .search{ width: 80%; } .search_arr { border: 1px solid # ...

  3. HTML阅读有没有检索,创建和使用HTML全文搜索索引(C++)

    现有库 以下是两个现有的解决方案,它们可以完全集成到应用程序中,而无需单独的过程(我相信这两个解决方案都将使用VC++进行编译). Xapian 是成熟的,可以做很多你需要的,从索引到排名检索.需要单 ...

  4. uniApp学习(8)搜索框的创建和自动获取焦点

    1.跳转到搜索页面功能 点击搜索跳转,显示热门搜索和,搜索历史 结果如下所示 1.创建搜索页search.vue 配置pages.json页面配置app-plus导航搜索页面(这个只针对h5和APP有 ...

  5. mysql索引创建规则、联合与一般索引、执行计划、索引选择,索引重建与下推

    数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树. 建 ...

  6. oracle 查询创建的全文索引,CSS_oracle全文搜索创建与使用示例,说明:使用全文索引需要使用 - phpStudy...

    oracle全文搜索创建与使用示例 说明:使用全文索引需要使用词法分析器,什么叫词法分析器呢,如:你想搜索"中国人",那么数据库的底层就会给你以"中国".&qu ...

  7. mysql中索引创建 查看和删除语句_MySQL索引的创建、删除和查看(学习中)

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  8. 小程序搜索框_小程序直播有了搜索入口 这波微信公域流量你要不要抓?

    [亿邦动力讯]日前,微信"搜一搜"上线直达小程序直播功能.这意味着,微信小程序直播有了一个搜索入口. 亿邦动力体验发现,在微信"搜一搜"输入美妆品牌名称&quo ...

  9. android 搜索框组件,Android零基础入门|搜索框组件SearchView

    原标题:Android零基础入门|搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输 ...

最新文章

  1. 方舟 game.ini 配置文件_方舟突然回归|这次居然是住院篇!
  2. 含根式的定积分计算_不定积分计算法则总结
  3. 第一篇 Entity Framework Plus 之 Audit
  4. 看穿面试这件事儿……
  5. android 模拟器声音设置,使用android模拟器录制声音
  6. Semaphore实现原理分析
  7. 易学源码html,HTML
  8. 开发好能重构的代码,都是这么干的
  9. ModuleNotFoundError: No module named ‘keras.api‘
  10. 设置占用GPU的比例
  11. “鱼”和“熊掌”也能兼得——省时省心
  12. Gmail过滤器设置
  13. JAVA在线看CAD图纸快速入门
  14. 基于人脸识别的学生签到打卡系统用户使用指南
  15. 日语输入法 android8.0,百度日文输入法
  16. LoadRunner11代理在Win10操作系统启动不起来,或者报错:该内存不能为written
  17. CDN百科 | APP崩了和CDN有关系吗?
  18. Raft 共识算法1-Raft基础
  19. webapp期末作业-oneapp
  20. 复习中国近现代史纲要--“政治编年史”

热门文章

  1. 雅特力AT32F403A串口UART8只能接收不能发送问题可能是因为UART8发送信号与XMC字节选信号冲突
  2. 均值、方差、标准差、均方根、均方误差、均方根误差的区别与联系
  3. 谁在synopsys vdk里搭建过基于cortex-a55和cortex-a76的平台,并在上面成功跑过linux?
  4. 学者的样子,读《不发表,就出局》
  5. C# WPF窗体设计器显示以及App.xaml文件打不开(VS 2022)
  6. 黄钟公的选择为啥是魔教?
  7. Python Turtle绘图[难度2星]:多边形螺旋线(颜色交叉/颜色分层)
  8. .IMA格式CT数据转成普通的.png或.jpg
  9. android字体变斜,TextView设置倾斜字体样式(android:textStyle=bold|italic)后,右边字显示不全...
  10. 最强大脑第六期饶舜涵和倪梓强 他们的大脑是天生的么?