Searching(三)|学习笔记

简介: 快速学习 Searching(三)

开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Searching】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/75/detail/15838


Searching(三)

 

内容简介

一. Lucene 建立索引的方式

二. 反向索引

三. 搜索

四. 如何建索引

五. 运行

六. 四种域的区别

七. 四种域的实例

八. 如何实现更新

九. 置顶与排序问题


八.如何实现更新

它的更新是先删除再添加的,不是在现有的上面直接更新的。所以我们想要把城市哈姆斯特改成别的,必须把当前按照查询条件删掉 document ,然后再写入它不是删除一条,是把整document删掉,所以新的 document其他内容,还需要再设一遍,然后添加进去 optimize,这就相当于做了一次  update

 

九.置顶与排序问题

我们看到的搜索引擎一般都会有搜索时候应该把哪个文档置顶问题。这取决于 boost factorfactor 这个值越高,就说明它越容易被搜索,它就越容易被置顶,置上去就更容易被搜到,排列的更靠前如何去设置呢?就是在真正进行 document ,在添加的时候,前面动作都一样的,后面就调用 setBoost 来设置值,默认值是1,设成比1表示它比较重要,设成1就表示它不太重要,这样就可以改变查询到他们之后的一个排序

 image.png

Lucene 真正在做搜索的时候,还做了一些优化,它大量操作发生在内存里,所以当在写入修改一个内存时候,如果不去做 optimize 这个动作,那就很难让别人直接能看到你的 index  Lucene 愿意去把它写出来直接调 optimize 就相当于在告诉,现在就把更新过的索引写入到硬盘,让别人能看到 Lucene 也支持多线程的操作,多线程非常重要,在很多的应用里面都在用它也支持多个线程从不同的 document 里面去读取内容,把结果写到 RAM ,然后把多个 RAM 的内容在 indexwrite 里面去合并,这些内容写入到 index 里面去。这些动作天生就是多线程的发生在背后。

 image.png

当然写入 IndexWriter 也是一样的,它也是用多线程的方式来实现的。

在进行搜索的时候,我们需要定义这个 query 。那么 query 是如何定义的 Query 是要定义一个搜索项,相当于 key 我想查 subject 等于 ant 这样的项,这个创建了一个 term query 然后 query 在 IndexSearcher 上面就能去 search ,就得到了 hits ,基本上就是这样一个写法可以来搜索到你想要的东西

 image.png

更复杂的就是你可能要有一个不像上面这样,用一个 term 来创建 query 。它需要去解析一下相应的查询的语句是 Lucene 的一个细节,query 不是通过查询下面生成,而是通过它指定的一个接口,一个 pass 接口输进去,如果你符合它格式要求的内容,它去产生一个 query但是不管哪一种,执行完之后都是一个hits 类型对象,下面的操作是一样

最后要一个 Lucene 上的问题就是Booster 决定它排序唯一因素。实际上 Lucene 会把每一个文档都计算出一个 score ,这个 score 决定了它在文档的结果里面搜索的结果里面在 hits 里面是如何排序的, booster 只是其中的因素之一

 image.png

实际上它用到的就是我们经常提到的,一个叫做 TFIDF 的算法TFIDF 是说文本词频乘以逆向文本词频,作为这一个文本的重要性词频是在文档里出现了多少次出现次数多,这个词重要,但是还有一种情况,比如“我”“的”这种词也在很多文档里出现,文本的词频非常高,但是这样的词并不重要而且实际上我们在搜索这样时候通常将它们过滤掉。 TF 是说我在指定的这些文档里,某个词出现的频率 IDF 是说文档总数用 D 的质来表示,这个词除以出现在哪些文档里比如,“这个词,先取它出现在哪些文档里的数量,然后要做一系列包括取对数的操作这说明如果一个词例如“我”“的”它们太常见了,在大量的文档里都出现,所以这个值除出来就接近于1,取 log 后接近于0。

如果这个词只在少量的文档里出现,比如这里面是所有动画片的一个脚本 Tom 只在猫和老鼠里出现了,其它的都没有出现,上面值除以下面的值,得到一个远远大于1的值,取 log就比较大“我”“的”在所有文档里都出现,这一项基本上约等于零,所以即使它的词频很大,乘以 IDF 之后就会变得很小也就是说这个词如果是个通用词,在大量文档里出现,它没有搜索价值只有在少量文档里出现,才有搜索价值。

这个算法前一部分就是我们设定的 TFIDF 的值,中间一部分就是boost 的值可以设成1.5也可以设成0.1,再往下是它的正则化以后值,这个值给出了在这个域里面个项出现的数量为什么要做正则化

有些可能出现的非常多,有些出现非常少,如果直接拿频率去做,就会非常复杂,这个值乘出来可能差异非常大,所以做正则化就是为了这个值压到01的范围里面去做这样整个处理完后出来的 score 才是整个文档在查询结果里面排序的依据,这里面最重要的是 TFIDF后面两个是可以自己设置的。前面部分就是我们说的自然源处理里面做搜索结果排序的一个基本依据当然 TFIDF 是其中之一,还有另外的因素比如链接数 Google 这样的搜索引擎要考虑链接数后面我们拿 Lucene 讲全文搜索原理。

全文搜索基本上都是这个逻辑,但是反向索引的结构可能有差异因为如果不这种反向索引,首先用关系性数据库很难操作正向索引很难操作

如果做正向的索引,你仍然避免不了全表或者全库的扫描这个动作,只有反向索引才能按关键词搜索这样才会比较快运行 Lucene 比较简单,不需要依赖其他任何东西Soft 需要安装工具后再运行。

相关文章
|
存储 安全 文件存储
Searching(二)|学习笔记
快速学习 Searching(二)
243 0
Searching(二)|学习笔记
|
JSON Apache 数据库
Searching(一)|学习笔记
快速学习 Searching(一)
142 0
Searching(一)|学习笔记
|
存储 算法 NoSQL
Caching(二)|学习笔记
快速学习 Caching(二)
123 0
Caching(二)|学习笔记
|
存储 缓存 JSON
Caching(三)|学习笔记
快速学习 Caching(三)
157 0
Caching(三)|学习笔记
|
存储 缓存 NoSQL
Caching(一)|学习笔记
快速学习 Caching(一)
143 0
Caching(一)|学习笔记
|
存储 缓存 负载均衡
Clustering(二)|学习笔记
快速学习 Clustering(二)
137 0
Clustering(二)|学习笔记
|
安全 Java 应用服务中间件
Distributed Object 2(三)|学习笔记
快速学习 Distributed Object 2(三)
132 0
Distributed Object 2(三)|学习笔记
|
存储 缓存 负载均衡
Clustering(一)|学习笔记
快速学习 Clustering(一)
106 0
Clustering(一)|学习笔记
|
Oracle Java 关系型数据库
Distributed Object 2(一)|学习笔记
快速学习 Distributed Object 2(一)
Distributed Object 2(一)|学习笔记
|
存储 Java 数据库
Arch. Components 2(三)|学习笔记
快速学习 Arch. Components 2(三)
Arch. Components 2(三)|学习笔记