cassandra + lucene集成
Stratio’s Cassandra Lucene Index
Stratio’s Cassandra Lucene Index, derived from Stratio Cassandra, is a plugin for Apache Cassandra that extends its index functionality to provide near real time search such as ElasticSearch or Solr, including full text search capabilities and free multivariable, geospatial and bitemporal search. It is achieved through an Apache Lucene based implementation of Cassandra secondary indexes, where each node of the cluster indexes its own data. Stratio’s Cassandra indexes are one of the core modules on which Stratio’s BigData platform is based.
Index relevance searches allows you to retrieve the n more relevant results satisfying a search. The coordinator node sends the search to each node in the cluster, each node returns its n best results and then the coordinator combines these partial results and gives you the n best of them, avoiding full scan. You can also base the sorting in a combination of fields.
Index filtered searches are a powerful help when analyzing the data stored in Cassandra with MapReduce frameworks asApache Hadoop or, even better, Apache Spark. Adding Lucene filters in the jobs input can dramatically reduce the amount of data to be processed, avoiding full scan.
Any cell in the tables can be indexed, including those in the primary key as well as collections. Wide rows are also supported. You can scan token/key ranges, apply additional CQL3 clauses and page on the filtered results.
This project is not intended to replace Apache Cassandra denormalized tables, inverted indexes, and/or secondary indexes. It is just a tool to perform some kind of queries which are really hard to be addressed using Apache Cassandra out of the box features.
More detailed information is available at Stratio’s Cassandra Lucene Index documentation.
Features
Stratio’s Cassandra Lucene Index and its integration with Lucene search technology provides:
- Full text search
- Geospatial search
- Bitemporal search
- Boolean (and, or, not) search
- Near real-time search
- Relevance scoring and sorting
- General top-k queries
- Custom analyzers
- CQL complex types (list, set, map, tuple and UDT)
- CQL user defined functions (UDF)
- Third-party CQL-based drivers compatibility
- Spark compatibility
- Hadoop compatibility
Not yet supported:
- Thrift API
- Legacy compact storage option
- Indexing
countercolumns - Columns with TTL
- Indexing static columns
Requirements
- Cassandra (identified by the three first numbers of the plugin version)
- Java >= 1.7 (OpenJDK and Sun have been tested)
- Maven >= 3.0
Build and install
Stratio’s Cassandra Lucene Index is distributed as a plugin for Apache Cassandra. Thus, you just need to build a JAR containing the plugin and add it to the Cassandra’s classpath:
Build the plugin with Maven:
mvn clean packageCopy the generated JAR to the lib folder of your compatible Cassandra installation:
cp plugin/target/cassandra-lucene-index-plugin-*.jar <CASSANDRA_HOME>/lib/Start/restart Cassandra as usual
- Alternatively, patching can also be done with this Maven profile, specifying the path of your Cassandra installation,
- this task also delete previous plugin's JAR versions in CASSANDRA_HOME/lib/ directory:
mvn clean package -Ppatch -Dcassandra_home=<CASSANDRA_HOME>
If you don’t have an installed version of Cassandra, there is also an alternative profile to let Maven download and patch the proper version of Apache Cassandra:
mvn clean package -Pdownload_and_patch -Dcassandra_home=<CASSANDRA_HOME>
Now you can run Cassandra and do some tests using the Cassandra Query Language:
<CASSANDRA_HOME>/bin/cassandra -f
<CASSANDRA_HOME>/bin/cqlsh
The Lucene’s index files will be stored in the same directories where the Cassandra’s will be. The default data directory is/var/lib/cassandra/data, and each index is placed next to the SSTables of its indexed column family.
For more details about Apache Cassandra please see its documentation.
Example
We will create the following table to store tweets:
CREATE KEYSPACE demo
WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 1};
USE demo;
CREATE TABLE tweets (
id INT PRIMARY KEY,
user TEXT,
body TEXT,
time TIMESTAMP,
latitude FLOAT,
longitude FLOAT,
lucene TEXT
);
We have created a column called lucene to link the index searches. This column will not store data. Now you can create a custom Lucene index on it with the following statement:
CREATE CUSTOM INDEX tweets_index ON tweets (lucene)
USING 'com.stratio.cassandra.lucene.Index'
WITH OPTIONS = {
'refresh_seconds' : '1',
'schema' : '{
fields : {
id : {type : "integer"},
user : {type : "string"},
body : {type : "text", analyzer : "english"},
time : {type : "date", pattern : "yyyy/MM/dd", sorted : true},
place : {type : "geo_point", latitude:"latitude", longitude:"longitude"}
}
}'
};
This will index all the columns in the table with the specified types, and it will be refreshed once per second. Alternatively, you can explicitly refresh all the index shards with an empty search with consistency ALL:
CONSISTENCY ALL
SELECT * FROM tweets WHERE lucene = '{refresh:true}';
CONSISTENCY QUORUM
Now, to search for tweets within a certain date range:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"}
}' limit 100;
The same search can be performed forcing an explicit refresh of the involved index shards:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
refresh : true
}' limit 100;
Now, to search the top 100 more relevant tweets where body field contains the phrase “big data gives organizations” within the aforementioned date range:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1}
}' limit 100;
To refine the search to get only the tweets written by users whose name starts with “a”:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"boolean", must:[
{type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
{type:"prefix", field:"user", value:"a"} ] },
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1}
}' limit 100;
To get the 100 more recent filtered results you can use the sort option:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"boolean", must:[
{type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
{type:"prefix", field:"user", value:"a"} ] },
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1},
sort : {fields: [ {field:"time", reverse:true} ] }
}' limit 100;
The previous search can be restricted to a geographical bounding box:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"boolean", must:[
{type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
{type:"prefix", field:"user", value:"a"},
{type:"geo_bbox",
field:"place",
min_latitude:40.225479,
max_latitude:40.560174,
min_longitude:-3.999278,
max_longitude:-3.378550} ] },
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1},
sort : {fields: [ {field:"time", reverse:true} ] }
}' limit 100;
Alternatively, you can restrict the search to retrieve tweets that are within a specific distance from a geographical position:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"boolean", must:[
{type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
{type:"prefix", field:"user", value:"a"},
{type:"geo_distance",
field:"place",
latitude:40.393035,
longitude:-3.732859,
max_distance:"10km",
min_distance:"100m"} ] },
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1},
sort : {fields: [ {field:"time", reverse:true} ] }
}' limit 100;
Finally, if you want to restrict the search to a certain token range:
SELECT * FROM tweets WHERE lucene='{
filter : {type:"boolean", must:[
{type:"range", field:"time", lower:"2014/04/25", upper:"2014/05/01"},
{type:"prefix", field:"user", value:"a"} ,
{type:"geo_distance",
field:"place",
latitude:40.393035,
longitude:-3.732859,
max_distance:"10km",
min_distance:"100m"} ] },
query : {type:"phrase", field:"body", value:"big data gives organizations", slop:1]}
}' AND token(id) >= token(0) AND token(id) < token(10000000) limit 100;
This last is the basis for Hadoop, Spark and other MapReduce frameworks support.
Please, refer to the comprehensive Stratio’s Cassandra Lucene Index documentation.
cassandra + lucene集成的更多相关文章
- Lucene系列二:Lucene(Lucene介绍、Lucene架构、Lucene集成)
一.Lucene介绍 1. Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包.提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人 ...
- 玩转大数据之Apache Pig如何与Apache Lucene集成
在文章开始之前,我们还是简单来回顾下Pig的的前尘往事: 1,Pig是什么? Pig最早是雅虎公司的一个基于Hadoop的并行处理架构,后来Yahoo将Pig捐献给Apache(一个开源软件的基金组 ...
- Lucene介绍及简单入门案例(集成ik分词器)
介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- Cassandra数据模型和模式(Schema)的配置检查
免责声明 本文档提供了有关DataStax Enterprise(DSE)和Apache Cassandra的常规数据建模和架构配置建议.本文档需要DSE / Cassandra基本知识.它不能代替官 ...
- Lucene详解
一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它不是一个完整的搜索应用程序 ...
- 学习笔记(二)--Lucene简介
Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包.提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包, ...
- cassandra的全文检索插件
https://github.com/Stratio/cassandra-lucene-index Stratio’s Cassandra Lucene Index Stratio’s Cassand ...
- 玩转大数据系列之Apache Pig如何与Apache Solr集成(二)
散仙,在上篇文章中介绍了,如何使用Apache Pig与Lucene集成,还不知道的道友们,可以先看下上篇,熟悉下具体的流程. 在与Lucene集成过程中,我们发现最终还要把生成的Lucene索引,拷 ...
- Hadoop日记Day1---Hadoop介绍
一.Hadoop项目简介 1. Hadoop是什么 Hadoop是一个适合大数据的分布式存储与计算平台. 作者:Doug Cutting:Lucene,Nutch. 受Google三篇论文的启发 2. ...
随机推荐
- 在web应用程序中使用MemcachedClient
本文来自:http://www.cnblogs.com/yukaizhao/archive/2008/11/10/memcached_client_usage.html 一. 背景: 在大访问量的we ...
- Babel6.x 转换ES6
本文介绍Babel6.x的安装过程~ 首先呢,可以使用Babel在线转换 https://babeljs.io/repl/ 然后进入主题:安装Babel(命令行环境,针对Babel6.x版本) 1.首 ...
- Linux 下的 Nginx 反向代理配置.
最近实践中遇到了需要利用 nginx 进行反向代理服务器请求的需求,以前没怎么碰触过,因此花了1个多小时,快速阅览了一下nginx官网在反向代理服务中给出的基本定义: 说实话,官网给予的定义是精准的, ...
- 《JavaScript 闯关记》之数组
数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引. JavaScript 数组是无类型的,数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型 ...
- Sublime Text插件FileHeader实践
FileHeader是一个文件模板插件,可以定制各种文件模板和文件头部信息,保存时可以自动更新文件的修改时间.在多人开发中这个功能相当实用. 具体介绍我就不细说了,主要是分享一下在使用FileHead ...
- 使用react-native做一个简单的应用-04界面主框架
欢迎界面搭建完毕,我们接下来需要做的就是搭建应用程序的主体框架啦.首先我们看一下首页的截图: 从图中看到,我将首页分为了三部分:用黑色矩形表示的头部,绿色表示的内容和红色表示的底部. 下面我们需要解决 ...
- RelativeLayout与LinearLayout的区别
1.LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的 containers,超过边界时,某些控件将缺失或消失.因此一个垂 ...
- Android系统休眠对程序的影响以及处理
Android系统在用户长时间不操作时,为了节省资源,系统会选择休眠.在休眠过程中自定义的Timer.Handler.Thread.Service等都会暂停.而有时候这种机制会影响到我们程序的正常运行 ...
- study notes: high performance linux server programming
1:linux网络API分为:socker地址API,socker基础API,网络信息API 1,socker地址API:包含IP地址和端口(ip, port).表示TCP通信的一端. 2,socke ...
- js压缩解压工具
参看下面链接:http://js.clicki.cc/