lucene

Elasticsearch深入:数据持久化过程@

99封情书 提交于 2020-02-26 16:31:32
前言 这篇文章主要介绍Elasticsearch的索引工作机制,它是如何利用translog来保证数据的安全,以及我们在生产环境中如何优化translog的参数来最大化性能,主要会介绍到elastic中常见的2个操作:refresh和flush,以及这2个接口是如何保证数据能够被检索到的。 一、数据持久化 我们把数据写到磁盘后,还要调用fsync才能把数据刷到磁盘中,如果不这样做在系统掉电的时候就会导致数据丢失,这个原理相信大家都清楚,elasticsearch为了高可靠性必须把所有的修改持久化到磁盘中。 elastic底层采用的是lucene这个库来实现倒排索引的功能,在lucene的概念里每一条记录称为document(文档),lucene使用segment(分段)来存储数据,用commit point来记录所有segment的元数据,一条记录要被搜索到,必须写入到segment中,这一点非常重要,后面会介绍为什么elastic搜索是near-realtime(接近实时的)而不是实时的。 elastic使用translog来记录所有的操作,我们称之为write-ahead-log,我们新增了一条记录时,es会把数据写到translog和in-memory buffer(内存缓存区)中,如下图所示: 内存缓存区和translog就是near-realtime的关键所在

Lucene 技术分享

依然范特西╮ 提交于 2020-02-26 09:21:22
提纲: 问题引入: 为啥模糊查询搜索引擎比数据库快?快在哪、快的原因,快的代价 为什么mysql等不行,为什么ES、Solr就很快 B+树和FST数据结构、倒排索引比较一下,说明其快的原因 FST数据结构 详细介绍: Lucene索引存储结构 基于Java的搜索引擎框架Lucene介绍: ES、Solr都基于Lucene 近实时搜索 Lucene2.9版本开始支持 支持以前,IndexWriter 必须commit以后,IndexReader 才能进行搜索 再次打开使用reopen,效率非常高 可以使得你对新创建还未完成提交的段(segment)进行搜索 索引建立过程、搜索过程 索引建立过程、搜索过程都会分词 分词扩展: 扩展字典表 ext_dict 停词表 stopword.dic 、 ext_stopword.dic 很重要,尤其是汉语分词IK、jieba 浅析为什么查询不准 据业务实际进行查询优化 建立索引过程可以加权,查询也可以加权 tf-idf算法 向量模型算法、BM25模型算法 BM25模型算法 取对数计算 的原因是不让单个此项相关度过高导致其他此项的相关度不起作用 经典检索算法:BM25 几种query原理分析 BooleanQuery 分三个子查询 MUST、SHOULD、MUST_NOT 与布尔表达式区别 PhraseQuery

lucene查询语法,适用于ELk:kibana查询

谁说我不能喝 提交于 2020-02-26 05:58:06
lucene查询语法,适用于ELk:kibana查询 Kibana在ELK中扮演着数据可视化角色,用来查询及展示数据; Elasticsearch查询采用的是luncene搜索引擎,其4过滤查询语法和lucene一致。 Kibana官方在线演示 字段搜索 Lucene支持实时数据。执行搜索时,您可以指定字段,也可以使用默认字段。字段名称和默认字段是特定于实现的。 限定字段全文搜索:field:value 精确搜索:关键字加上双引号 filed:"value" http.code:404 搜索http状态码为404的文档 字段本身是否存在 _exists_:http:返回结果中需要有http字段 _missing_:http:不能含有http字段 通配符搜索 Lucene支持单个术语内的单个和多个字符通配符搜索(不在短语查询中)。 ? 匹配单个字符 * 匹配0到多个字符 te?t,test*,te*t 注意:您不能使用*或?符号作为搜索的第一个字符。 正则表达式搜索 Lucene支持正向表达式搜索. name:/joh?n(ath[oa]n)/ 模糊搜索 quikc~ brwn~ foks~ ~:在一个单词后面加上~启用模糊搜索,可以搜到一些拼写错误的单词 first~ 这种也能匹配到 frist 还可以设置编辑距离(整数),指定需要多少相似度 cromm~1 会匹配到 from 和

Lucene索引存储结构

女生的网名这么多〃 提交于 2020-02-26 01:15:56
字典数据结构: 字典树(Trie tree) 、FST 字典树(Trie tree) 典型应用是用于统计和排序大量的 字符串 (但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计。 它的优点是:最大限度地减少无谓的字符串比较,查询效率比 哈希表 高。 基本的实现有array与linked-list两种: array实现: linked-list实现: 双数组Trie树 在Trie数实现过程中,我们发现了每个节点均需要 一个数组来存储next节点,非常占用存储空间,空间复杂度大, 双数组Trie树正是解决这个问题的。 双数组Trie树(DoubleArrayTrie)是一种空间复杂度低的Trie树, 应用于字符区间大的语言(如中文、日文等)分词领域。 双数组的原理是,将原来需要多个数组才能表示的Trie树,使用两个数组就可以存储下来,可以极大的减小空间复杂度 使用两个数组base和check来维护Trie树, base负责记录状态, check负责检查各个字符串是否是从同一个状态转移而来, 当check[i]为负值时,表示此状态为字符串的结束。 check[i] 代表从什么状态转换过来,如下,都是从base[t] 转换过来,所以 check[ta] = check[tb] base[t] + a.code = base[ta] base[t] + b.code = base

How to boost hibernate-search query with field values?

回眸只為那壹抹淺笑 提交于 2020-02-25 05:40:09
问题 I have two fields in an entity class: establishmentName contactType contactType has values like PBX, GSM, TEL and FAX I want a scoring mechanism as to get the most matching data first then PBX, TEL, GSM and FAX. Scoring: On establishmentName to get the most matching data first On contactType to get first PBX then TEL and so on My final query is: (+establishmentName:kamran~1^2.5 +(contactType:PBX^2.0 contactType:TEL^1.8 contactType:GSM^1.6 contactType:FAX^1.4)) But it not returning the result.

DuplicateFilter in Hibernate Search

筅森魡賤 提交于 2020-02-24 12:31:11
问题 I know there is a built-in DuplicateFilter in Lucene, to deduplicate the results from lucene. This is a very important feature for the users to search on the document database, where duplicating rate is very high. As I am using Hibernate Search to do the full text index/search, and wondering if there is a way for me bring the DuplicateFilter on Lucene to the Hibernate Search? 回答1: It is possible by using filters. See for BestDriversFilter - it extends org.apache.lucene.search.Filter in the

实战 Lucene2.0

别等时光非礼了梦想. 提交于 2020-02-23 11:51:07
Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。 目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。 图 1 表示了搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程: 图 1. 搜索应用程序和 Lucene 之间的关系 回页首 索引和搜索 索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档

Mac自己搭建爬虫搜索引擎(nutch+elasticsearch是失败的尝试,改用scrapy+elasticsearch)

感情迁移 提交于 2020-02-22 15:23:21
1.引言 项目需要做爬虫并能提供个性化信息检索及推送,发现各种爬虫框架。其中比较吸引的是这个: Nutch+MongoDB+ElasticSearch+Kibana 搭建搜索引擎 E文原文在:http://www.aossama.com/search-engine-with-apache-nutch-mongodb-and-elasticsearch/ 考虑用docker把系统搭建起来测试: docker来源如下: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html https://store.docker.com/community/images/pure/nutch-mongo 然而,docker下载image时实在是太慢,放弃docker! Mac 设置JAVA_HOME: vi ~/.bash_profile export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH export CLASS_PATH=$JAVA_HOME/lib 2.安装Mongo Mac下直接用brew安装,此时最新版本是3.4.7。 安装好后建/data/db目录,mongod启动服务。

how can I implement the tf-idf and cosine similarity in Lucene?

让人想犯罪 __ 提交于 2020-02-22 05:19:10
问题 How can I implement the tf-idf and cosine similarity in Lucene? I'm using Lucene 4.2. The program that I've created does not use tf-idf and Cosine similaryty, it only uses TopScoreDocCollector. import com.mysql.jdbc.Statement; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.util.Version; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index

【蛙蛙推荐】Lucene.net试用

岁酱吖の 提交于 2020-02-22 04:32:41
【蛙蛙推荐】Lucene.net试用 【简介】   lucene.net好多人都知道的吧,反正我是最近才好好的看了一下,别笑我拿历史当新闻哦,不太了解Lucence的朋友先听我说两句哦。Lucene的知识主要分为索引、搜索、分析器、性能优化几个部分。索引和搜索没啥可说的,看几个例子就会了,来回那一套儿,按部就班做几个实验就熟悉了。分析器是Lucence的精华,又分为分词和过滤两部分,而且中文分词更是难点,我的例子里是用从博客园程序中提取出来的Lucene.Net.Analysis.Cn.dll来实现中文分词的,谁有中科院的那套中科院ICTCLAS分词工具的C#版麻烦提供一下哦。性能优化也很重要,因为如果要索引的文件比较大的话,建立索引的性能就会很大的下降,你可以调整IndexWriter的几个参数来优化索引性能,还有可以用IndexWriter.Optimize()方法(这个方法主要是优化查询速度,反而使索引性能有所下降),另外就是可以用多线程来分别对不同的内容进行索引并保存到RAMDirectory里,然后再把所有的内存索引合并到FSDirectory里,甚至可以让多台服务器分别处理内容的各个部分,然后把索引结果放到一个队列里,再有一台机器去读取索引结果队列并合并索引结果。   做这个示例主要是为了演示一下Lucene.net的功能,它可以对你指定的目录里的.txt,.htm,