lucene

浅析分布式搜索引擎

被刻印的时光 ゝ 提交于 2020-01-30 08:44:38
1. 基础知识 1.1 认识Lucene Lucene是一套用于 全文检索 和 搜索 的 开放源码程序库 ,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索,在Java开发环境里Lucene是一个成熟的免费开放源代码工具;就其本身而论,Lucene是现在并且是这几年,最受欢迎的免费Java信息检索程序库。 Lucene官网: http://lucene.apache.org 1.2 倒排索引 在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。 那么,倒排索引就是 关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。 在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。 那么,倒排索引就是 关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。 DocId Doc 1 谷歌地图之父跳槽 Facebook 2 谷歌地图之父加盟 Facebook 3 谷歌地图创始人拉斯离开谷歌加盟 Facebook 4 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 5 谷歌地图之父拉斯加盟社交网站

Word boundary in Lucene regex

社会主义新天地 提交于 2020-01-30 05:35:07
问题 I'd like to a make a regex query in Elastisearch with word boundaries, however it looks like the Lucene regex engine doesn't support \b . What workarounds can I use? 回答1: In ElasticSearch regex flavor, there is no direct equivalent to a word boundary. Initial \b is something like (^|[^A-Za-z0-9_]) if the word starts with a word char, and the trailing \b is like ($|[^A-Za-z0-9_]) if the word ends with a word char. Thus, we need to make sure that there is a non-word char before and after word

ElasticSearch 学习笔记一 简介

只愿长相守 提交于 2020-01-29 12:22:55
一、Lucene简介 A、Lucene的总体架构   1、文档(document):索引与搜索的主要数据载体,它包含一个或多个字段,存放将要写入索引或将从索引搜索出来的数据。   2、字段(field): 文档的一个片段,它包含两个部分: 字段的名称和内容。   3、词项(term):搜索的一个单位,代表文本中的某个词。   4、词条(token): 词项在字段中的一次出现,包括词项的文本、开始和结束的位置以及类型。 Apache Lucene将写入索引的所有信息组织成一种名为倒排索引(inverted index)的结构。 B、Lucene查询语言   1、AND: 操作符两边的词项都在文档中出现。   2、OR:任意词项在文档中出现。   3、NOT:文档必须不包含该操作符后面的词项。   4、+: 只有包含操作符后面词项的文档才会被认为是与从句匹配。   5、-: 从句匹配的文档不能出现操作符后面的词项。 Lucene中所有的数据都存储在字段(field)中,而字段又是文档的组成单位。为了实现针对某个字段的查询,用户需要提供字段名称,再加上冒号及条件。支持两种通配符: ?和*。?是匹配任意一个字符,*是匹配多个字符。~表示模糊查询。 二、ElasticSearch简介 A、基本概念   索引:ElasticSearch将它的数据存储在一个或多个索引(index)中

云计算平台(检索篇)-Elasticsearch-检索篇

痞子三分冷 提交于 2020-01-28 04:28:15
ES检索篇主要是对索引中的数据进行查询的一个过程: 1.IndexReader打开索引文件,读取并打开指向索引文件的流。 2.用户输入查询语句 3.将查询语句转换为查询对象Query对象树 4.构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分)。 5.构造Scorer对象树,用于计算打分(TermScorer.score())。 6.在构造Scorer对象树的过程中,其叶子节点的TermScorer会将词典和倒排表从索引中读出来。 7.构造SumScorer对象树,其是为了方便合并倒排表对Scorer对象树的从新组织,它的叶子节点仍为TermScorer,包含词典和倒排表。此步将倒排表合并后得到结果文档集,并对结果文档计算打分公式中的蓝色部分。打分公式中的求和符合,并非简单的相加,而是根据子查询倒排表的合并方式(与或非)来对子查询的打分求和,计算出父查询的打分。 8.将收集的结果集合及打分返回给用户 具体过程文章已经有很多了,我引用一个博友的文章: Lucene学习总结之七:Lucene搜索过程解析(1) http://www.cnblogs.com/forfuture1978/archive/2010/04/04/1704242.html Lucene学习总结之七:Lucene搜索过程解析(2)

Lucene05-分词器

此生再无相见时 提交于 2020-01-27 04:07:21
Lucene05- 分词器 1、 概念 Analyzer (分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是 Analyzer 类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。如下图 注意:在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果。所以当改变分词器的时候,需要重新建立索引库 2、 常见的中文分词器 中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在 “ 帽子和服装 ” 中, “ 和服 ” 就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词 2.1 单字分词 就是按照中文一个字一个字地进行分词,效率比较低。如: “ 我们是中国人 ” ,效果: “ 我 ” 、 “ 们 ” 、 “ 是 ” 、 “ 中 ” 、 “ 国 ” 、 “ 人 ” 。( StandardAnalyzer 就是这样) Analyzer analyzer2 = new StandardAnalyzer(); 2.2 二分法分词 按两个字进行切分,把相邻的两个字组成词分解出来,效率也比较低。而且很多情况下分的词不对。如: “ 我们是中国人 ” ,效果: “ 我们 ” 、 “ 们是 ” 、 “ 是中 ” 、 “ 中国 ”

Solr4.8.0源码分析(7)之Solr SPI

a 夏天 提交于 2020-01-26 13:35:07
Solr4.8.0源码分析(7)之Solr SPI 查看Solr源码时候会发现,每一个package都会由对应的resources. 如下图所示: 一时对这玩意好奇了,看了文档以后才发现,这个services就是java SPI机制。首先介绍下java SPI机制,然后再结合Solr谈一下SPI。 1. JAVA SPI 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。 jdk提供服务实现查找的一个工具类:java.util.ServiceLoader 假设有一个内容搜索系统,分为展示和搜索两个模块。展示和搜索基于接口编程。搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。实例代码如下: Search.java: 搜索接口 1 package search; 2 3 import java.util.List; 4 5 import definition.Doc; 6 7 public interface Search { 8

Lucene简介和使用

筅森魡賤 提交于 2020-01-26 02:59:15
全文检索 数据分类: 结构化数据:格式、长度、类型等固定,如数据库中的数据 非结构化数据:格式、长度、类型等不固定,如pdf、html文件 数据查询: 结构化数据:sql语句 非结构化数据:将非结构化数据转换为结构化数据,建立索引然后查询 全文检索就是先创建索引然后查询索引的过程 全文检索的应用场景 : 搜索引擎,如百度、谷歌 站内搜索,如微博、csdn文章 电商搜索,如淘宝、京东 等等 Lucene简介 Lucene是一个基于Java开发的开源全文检索引擎工具包,但它 不是一个完整的全文检索引擎,而是一个全文检索引擎的架构 ,提供了完整的查询引擎和索引引擎,部分文本分析引擎。 Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。 Lucene实现全文检索流程 上面说到 全文检索就是先创建索引然后查询索引的过程 ,Lucene实现全文检索就是需要创建索引和查询索引。 使用Lucene 创建索引 需要的jar包: commons-io-2.6.jar junit-4.10.jar lucene-analyzers-common-7.4.0.jar lucene-core-7.4.0.jar 测试用的原始文档D:\java

Solr和ES对比

我是研究僧i 提交于 2020-01-25 23:16:48
搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介 * Elasticsearch是一个 实时 的 分布式 搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于 全文搜索 , 结构化搜索 以及 分析 ,当然你也可以将这三者进行组合。 Elasticsearch是一个 建立在全文搜索引擎 Apache Lucene™ 基础上 的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。 但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。 Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。 当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作: 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 实时分析的分布式搜索引擎。 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流

Custom Solr analyzers not being used during indexing

本小妞迷上赌 提交于 2020-01-25 20:50:12
问题 I have a bunch of PDF files on my machine which I want to index in Solr. For this purpose, I have created a schema file with custom field types and user-defined fields. Given below are the fields and copyFields in my schema.xml : <field name="id" type="custom01" indexed="true" stored="true" required="true" multiValued="false" /> <field name="_version_" type="long" indexed="true" stored="false"/> <field name="_root_" type="string" indexed="true" stored="false" docValues="false" /> <field name=

Neo4j PostingsFormat with name 'BlockTreeOrds' does not exist

邮差的信 提交于 2020-01-25 20:28:27
问题 I tried to packaged my project. But when I run the jar file, I find a bug. Exception in thread "main" java.lang.RuntimeException: Error starting org.neo4j.kernel.impl.factory.CommunityFacadeFactory, D:\f ... Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine@5483163c' failed to initialize. Please see attached cause exception. ... Caused by: java.lang.IllegalArgumentException: An SPI class of type org