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. ...
随机推荐
- Ajax跨域访问解决办法
方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...
- Android学习总结——适配器
适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - 下拉列表控件.AutoComplet ...
- Python关于eval与json在字典转换方面的性能比较
背景介绍 因为python中有eval()方法,可以很方便的将一些字符串类型与字典等数据结构之间进行转换, 所以公司的数据处理同事在保存一些特殊数据时就直接将字典的字符串保存在数据库中. 在程序中读取 ...
- SQL Server2005使用CTE实现递归
本文来自:http://www.cnblogs.com/wenjl520/archive/2010/01/18/1650393.html CTE递归原理: 递归CTE是由两个最小查询构建的.第一个是定 ...
- jquery $(function) 区别
document.ready和onload的区别——JavaScript文档加载完成事件 页面加载完成有两种事件 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二是onloa ...
- 美化select的jquery插件
自己写的一个美化select插件,浏览器自带的实在太丑,还不能用css自定义. 插件主要原理是隐藏原生的select控件,支持select上设置change事件. 脚本 /* * iSelect * ...
- android 获取屏幕尺寸
文章转载自:http://blog.csdn.net/congqingbin/article/details/7474276// 通过WindowManager获取 DisplayMetrics dm ...
- Ribbon2: 创建动态的Ribbon库
Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...
- oracle取分组的前N条数据
select * from(select animal,age,id, row_number()over(partition by animal order by age desc) row_num ...
- 如何查看SQLServer数据库每个表占用的空间大小?
如何查看SQLServer数据库每个表占用的空间大小? 创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace]AS BEGIN SET NOCOUNT ...