Overview¶
Hawkore's Advanced Lucene Index1 is an implementation for Apache Ignite that improves its text indexation functionality to provide near real time search such as ElasticSearch or Solr, including full text search capabilities as well as multivariable, geospatial and bitemporal search through SQL queries. It is achieved through an Apache Lucene based implementation of Apache Ignite Grid H2 index, where each node of the cluster indexes its own data.
graph TB
subgraph Apache Ignite Cluster
subgraph Node launching Query
sqlEngineClient("QUERY engine <br/>reduces result sets from map-query run")
end
subgraph Server Node 1
cache1Bis("Qn") -.- luceneIdx1Bis["LQn"]
sqlEngine("QUERY engine") -.-> cache1
cache1("Q1 (QueryEntity-Table)") -.- luceneIdx1["LQ1 (Local Advanced H2 Lucene Index for Q1)"]
end
subgraph Server Node N
sqlEngineN("QUERY engine") -.-> cacheN
cacheN("Q1 (QueryEntity-Table)") -.- luceneIdxN["LQ1(Local Advanced H2 Lucene Index for Q1)"]
cacheNBis("Qn") -.- luceneIdxNBis["LQn"]
end
sqlEngineClient -. "#160;map-query" .-> sqlEngine
sqlEngineClient -. "#160;map-query" .-> sqlEngineN
sqlEngineN -. "#160;result set".-> sqlEngineClient
sqlEngine -. "#160;result set".-> sqlEngineClient
end
classDef centered text-align:center;
classDef green fill:#9f6,stroke:#333,stroke-width:2px;
classDef orange fill:#f96,stroke:#333,stroke-width:4px;
classDef red fill:#dc3545,color:white,stroke:#333,stroke-width:4px;
classDef white fill:white;
class sqlEngineClient centered;
class cache1,cache2,cacheN orange;
class luceneIdx1,luceneIdx2,luceneIdxN green;
class sqlEngine,sqlEngineN,sqlEngineClient red;
class cacheNBis,luceneIdxNBis,cache1Bis,luceneIdx1Bis white;
Index relevance searches allow you to retrieve the n more relevant results satisfying a search. Query is sent to each server node in the cluster, each node returns its n best results and then these partial results are combined and gives you the n best of them, avoiding full scan. You can also base the sorting in a combination of fields. See Affinity Collocation performance tip for more details.
Any Pojo's fields can be indexed, including those in the primary key (composed primary key with affinity) as well as collections. Take a look to Examples.
You can apply additional SQL clauses and page on the filtered results. When you add additional SQL clauses, to ensure SQL
execution plan uses Advanced Lucene Index, add USE INDEX(the_lucene_index_name)
to select statement, take a look to Affinity Collocation for a sample.
Index filtered searches are a powerful help when analyzing the data stored in Apache Ignite. Adding Lucene filters can dramatically reduce the amount of data to be processed on analytics, avoiding full scan.
This project is not intended to replace Apache Ignite default indexing implementation, it is just a tool to perform some kind of queries which are really hard to be addressed using Apache Ignite SQL or full text queries out of the box features.
Features¶
Hawkore's Advanced Lucene Index for Apache Ignite and its integration with Apache Lucene search technology provides:
- Supports on disk persistence, without lost on-memory computation layer performance, minimizing node startup.
- Secure implementation for Apache Ignite EncryptionSpi as Lucene index does not store cache value. Please note that cache key and indexed fields will not be encrypted for performance reasons, so never index sensitive data neither store sensitive data on cache key.
- Update and rebuild at runtime
- Local index partitioning by key
- Supports legacy Apache Ignite's TextQuery with advanced lucene search expresion
- Supports Lucene classic query parser syntax on lucene search expression
- Full text search (language-aware analysis, wildcard, fuzzy, regexp)
- Boolean search (and, or, not)
- Sorting by relevance, column value and distance
- Geospatial indexing (points, lines, polygons and their multiparts)
- Geospatial transformations (bounding box, buffer, centroid, convex hull, union, difference and intersection)
- Geospatial operations (intersects, contains and is within)
- Bitemporal search (valid and transaction time durations)
- Below complex data types can be indexed, searched and sorted
- Complex Java types
- Collection Java types
- Map Java types
- Ignite Cache Entry (
_KEY
,_VAL
)
- Paging, even with sorted searches
- Spring Data 2.0 integration
Importing maven dependency¶
Add repository and the Maven dependency below to your pom.xml file to make sure that the module is included into your application:
<dependency> <groupId>com.hawkore.libs.ignite</groupId> <artifactId>hk-indexing</artifactId> <version>2.8.1-hk</version> </dependency>
<repositories> <repository> <id>Hawkore Repository</id> <url>https://repository.hawkore.com/maven2/</url> </repository> </repositories>
Syntax¶
Indexes are linked to a dummy column called lucene
due to SQL syntax limitations:
This column wasn't intended to store anything, it was just a trick to embed Lucene syntax into SQL syntax, so custom search predicates could be directed to this dummy column:
SELECT * FROM "test".user WHERE lucene = '...';
[...] String query = "SELECT * FROM \"test\".user WHERE lucene = '...'"; SqlFieldsQuery q = new SqlFieldsQuery(query); List<List<?>> resultSet = ignite.context().query().querySqlFields(q, false).getAll(); [...]
[...] TextQuery<KeyClass, ValueClass> textQuery = new TextQuery<>(ValueClass.class, "lucene query"); List<Entry<KeyClass, ValueClass>> entries = ignite.cache("aCacheName").query(textQuery).getAll(); [...]
Apache Ignite only allows one lucene index per table, whereas there is no limit for the number of per-column indexes that a table can have. So, an additional benefit of creating indexes over dummy column is that you can have multiple Lucene indexes per table, as long as they are considered per-column indexes.
Examples¶
You can find samples source code at Hawkore's Apache Ignite extensions sample project.
Create the following Query Entity to store tweets using Java Annotation Syntax.
/** TweetKey for affinity collocation based on country code */ public class TweetKey { // index=true will create a Grid H2 index (TWEETKEY_ID_IDX index name) for // non lucene searches @QuerySqlField(index = true) private Integer id; // affinity key annotated is auto-indexed on a Grid H2 index (AFFINITY_KEY // index name) for non lucene searches annotated it with @QuerySqlField to publish as table column to allow use // it from a lucene index mapper @QuerySqlField @AffinityKeyMapped private String countryCode; [...] }
@QueryTextField( // Index will be refreshed every 60 seconds, with lucene index optimization every // 10 minutes indexOptions = @IndexOptions(refreshSeconds = 60, partitions = 10, optimizerSchedule = "*/10 * * * *"), // this will create a field named "id" into Lucene Document that will be // indexed; mapped to composed primary key TweetKey's @QuerySqlField "id" integerMappers = @IntegerMapper(field = "id", column = "id"), // this will create a field named "countryCode" into Lucene Document that // will be indexed; mapped to composed primary TweetKey's @QuerySqlField // "countryCode" stringMappers = @StringMapper(field = "countryCode", column = "countryCode") ) public class Tweet { // this will create an field named "user" into Lucene Document that will be // indexed @QueryTextField(stringMappers = @StringMapper()) @QuerySqlField private String user; // this will create an field named "body" into Lucene Document that will be // indexed @QueryTextField(textMappers = @TextMapper(analyzer = "english")) @QuerySqlField private String body; // this will create an field named "time" into Lucene Document that will be // indexed @QueryTextField(dateMappers = @DateMapper(pattern = "yyyy/MM/dd")) @QuerySqlField private Date time; /** * WGS84 coordinates lat/lon - EPSG:4326 - SRID * <p> * Added double index for performance testing purposes: * <ul> * <li>Grid H2 geospatial index (@QuerySqlField(index = true) on Geometry type) * <li> * <li>Lucene indexed field with a GeoShapeMapper * <li> * </ul> */ @QuerySqlField(index = true) @QueryTextField(geoShapeMappers = { @GeoShapeMapper(transformations = @GeoTransformation(type = GeoTransformationType.CENTROID)) }) private Geometry place; [...] }
<bean id="tweetsCache" class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="tweets" /> <property name="rebalanceMode" value="ASYNC"/> <property name="cacheMode" value="PARTITIONED" /> <property name="indexedTypes"> <array> <value>com.hawkore.ignite.lucence.samples.TweetKey</value> <value>com.hawkore.ignite.lucence.samples.Tweet</value> </array> </property> </bean>
Search for tweets within a certain date range and country 'ES'
forcing an explicit refresh:
-- fetch all nodes, all partitions SELECT * FROM "tweets".tweet WHERE lucene = '{ refresh: true, filter: [ {type: "range", field: "time", lower: "2018/12/1", upper: "2018/12/30"}, {type: "match", field: "countryCode", value: "ES"} ] }' limit 10;
+-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE| +=====+=============+===========+===================================+=========================+===============================================+ |2165 | ES | user_2165 | big data gives organizations 2165 | 2018-12-28 14:12:20.281 | POINT (-4.92513343915219 40.64236110849513)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1587 | ES | user_1587 | big data gives organizations 1587 | 2018-12-16 00:55:23.281 | POINT (-5.098213444656379 43.459438185231384)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1265 | ES | user_1265 | big data gives organizations 1265 | 2018-12-10 17:19:50.281 | POINT (-7.4128376675240055 39.099864820365006)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | 687 | ES | user_687 | big data gives organizations 687 | 2018-12-04 04:32:53.281 | POINT (1.184374470480233 37.99881175600552)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1876 | ES | user_1876 | big data gives organizations 1876 | 2018-12-21 19:57:51.281 | POINT (-8.689392803476888 40.664873036196745)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1298 | ES | user_1298 | big data gives organizations 1298 | 2018-12-11 05:04:56.281 | POINT (-4.522693021324091 36.69911883816738)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | 976 | ES | user_976 | big data gives organizations 976 | 2018-12-06 23:20:21.281 | POINT (-1.9591311217424379 38.20223534410276)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | 398 | ES | user_398 | big data gives organizations 398 | 2018-12-02 08:57:26.281 | POINT (-7.292375170141108 37.65097113537808)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | 463 | ES | user_463 | big data gives organizations 463 | 2018-12-02 16:44:21.281 | POINT (-3.921097606609352 43.516520021570216)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1941 | ES | user_1941 | big data gives organizations 1941 | 2018-12-23 06:25:56.281 | POINT (-6.059520151943939 43.66248813138894)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+
Now, to search the top 100 more relevant tweets where body field contains the phrase “big data gives organizations” within the aforementioned date range:
-- fetch all nodes, all partitions SELECT * FROM "tweets".tweet WHERE lucene = '{ filter: {type: "range", field: "time", lower: "2018/12/1", upper: "2018/12/30"}, query: {type: "phrase", field: "body", value: "big data gives organizations", slop: 1} }' limit 10;
+-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE| +=======+=============+=============+=====================================+=========================+===============================================+ |100000 | PT | user_100000 | big data gives organizations 100000 | 2018-12-02 14:41:26.055 | POINT (-12.804270818519944 35.257005702859956)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100004 | PT | user_100004 | big data gives organizations 100004 | 2018-12-07 05:48:16.055 | POINT (-9.880225538191423 43.13987644215017)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100008 | PT | user_100008 | big data gives organizations 100008 | 2018-12-11 20:55:22.055 | POINT (-13.584484218802968 40.91748468947855)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100012 | PT | user_100012 | big data gives organizations 100012 | 2018-12-16 12:02:44.055 | POINT (-14.31039962741422 39.51300880064243)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100016 | PT | user_100016 | big data gives organizations 100016 | 2018-12-21 03:10:22.055 | POINT (-7.52114274387922 41.40733126261017)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100020 | PT | user_100020 | big data gives organizations 100020 | 2018-12-25 18:18:16.055 | POINT (-11.224500778886643 39.397268185532994)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100003 | PT | user_100003 | big data gives organizations 100003 | 2018-12-06 02:01:32.055 | POINT (-6.571575592661638 41.20330932442183)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100007 | PT | user_100007 | big data gives organizations 100007 | 2018-12-10 17:08:34.055 | POINT (-7.566376116761791 37.46290158666966)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100011 | PT | user_100011 | big data gives organizations 100011 | 2018-12-15 08:15:52.055 | POINT (-4.4593463655125785 39.76012301891313)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+ |100015 | PT | user_100015 | big data gives organizations 100015 | 2018-12-19 23:23:26.055 | POINT (-7.27460821782345 34.734641570977345)| +-------+-------------+-------------+-------------------------------------+-------------------------+-----------------------------------------------+
To refine the search to get only the tweets written by users whose names start with "user_1":
SELECT * FROM "tweets".tweet WHERE lucene = '{ filter: [ {type: "range", field: "time", lower: "2018/12/1", upper: "2018/12/30"}, {type: "prefix", field: "user", value: "user_1"} ], query: {type: "phrase", field: "body", value: "big data gives organizations", slop: 1} }' limit 10;
+-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE| +=====+=============+===========+===================================+=========================+===============================================+ |1587 | ES | user_1587 | big data gives organizations 1587 | 2018-12-16 00:55:23.281 | POINT (-5.098213444656379 43.459438185231384)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1265 | ES | user_1265 | big data gives organizations 1265 | 2018-12-10 17:19:50.281 | POINT (-7.4128376675240055 39.099864820365006)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1876 | ES | user_1876 | big data gives organizations 1876 | 2018-12-21 19:57:51.281 | POINT (-8.689392803476888 40.664873036196745)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1298 | ES | user_1298 | big data gives organizations 1298 | 2018-12-11 05:04:56.281 | POINT (-4.522693021324091 36.69911883816738)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1941 | ES | user_1941 | big data gives organizations 1941 | 2018-12-23 06:25:56.281 | POINT (-6.059520151943939 43.66248813138894)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1652 | ES | user_1652 | big data gives organizations 1652 | 2018-12-17 06:10:23.281 | POINT (-2.6977596446646546 38.33969745722176)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1074 | ES | user_1074 | big data gives organizations 1074 | 2018-12-08 03:15:20.281 | POINT (-0.4078034776745305 43.52978507812909)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1363 | ES | user_1363 | big data gives organizations 1363 | 2018-12-12 05:06:51.281 | POINT (-0.9404159474868417 39.5602738333939)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1717 | ES | user_1717 | big data gives organizations 1717 | 2018-12-18 12:35:48.281 | POINT (-7.235607613329625 41.9169647371335)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+ |1428 | ES | user_1428 | big data gives organizations 1428 | 2018-12-13 06:19:11.281 | POINT (0.5042428198023727 38.45498637806938)| +-----+-------------+-----------+-----------------------------------+-------------------------+-----------------------------------------------+
To get the 100 more recent filtered results you can use the sort option:
-- fetch all nodes, all partitions SELECT * FROM "tweets".tweet WHERE lucene = '{ filter: [ {type: "range", field: "time", lower: "2018/12/1", upper: "2018/12/30"}, {type: "prefix", field: "user", value: "user_1"} ], query: {type: "phrase", field: "body", value: "big data gives organizations", slop: 1}, sort: {field: "time", reverse: true} }' limit 10;
+-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE| +=====+=============+===========+===================================+=========================+==============================================+ |1977 | ES | user_1977 | big data gives organizations 1977 | 2018-12-24 02:01:38.281 | POINT (-7.477987943774339 41.014636319719024)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1981 | ES | user_1981 | big data gives organizations 1981 | 2018-12-24 04:13:36.281 | POINT (0.1059021659739634 38.79039224828353)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1985 | ES | user_1985 | big data gives organizations 1985 | 2018-12-24 06:25:50.281 | POINT (-5.983456829407351 41.896588879183504)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1989 | ES | user_1989 | big data gives organizations 1989 | 2018-12-24 08:38:20.281 | POINT (-4.130927328299924 36.85260143749068)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1993 | ES | user_1993 | big data gives organizations 1993 | 2018-12-24 10:51:06.281 | POINT (-6.18076059916187 40.61299791391745)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1997 | ES | user_1997 | big data gives organizations 1997 | 2018-12-24 13:04:08.281 | POINT (-4.616316986265494 44.43567790944285)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1976 | ES | user_1976 | big data gives organizations 1976 | 2018-12-24 01:28:41.281 | POINT (-6.108306732316194 44.2050024907756)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1980 | ES | user_1980 | big data gives organizations 1980 | 2018-12-24 03:40:35.281 | POINT (-5.180030491391422 36.59705729609825)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1984 | ES | user_1984 | big data gives organizations 1984 | 2018-12-24 05:52:45.281 | POINT (-4.45100770727997 36.9390187798808)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+ |1988 | ES | user_1988 | big data gives organizations 1988 | 2018-12-24 08:05:11.281 | POINT (0.1328199480870662 39.30857018646536)| +-----+-------------+-----------+-----------------------------------+-------------------------+----------------------------------------------+
The previous search can be restricted to tweets created close to a geographical position:
-- fetch all nodes, all partitions SELECT *, PUBLIC.ST_DISTANCE_SPHERE(place, 'POINT (-3.703790 40.416775)')/1000 as distance_km FROM "tweets".tweet WHERE lucene = '{ filter: [ {type: "range", field: "time", lower: "2018/12/1", upper: "2020/12/30"}, {type: "prefix", field: "user", value: "user_1"}, {type: "geo_distance", field: "place", latitude: 40.3930, longitude: -3.7328, max_distance: "20km"} ], query: {type: "phrase", field: "body", value: "big data gives organizations", slop: 1}, sort: {field: "time", reverse: true} }' limit 10;
+------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE | DISTANCE_KM| +======+=============+============+====================================+=========================+================================================+===================+ |10661 | ES | user_10661 | big data gives organizations 10661 | 2020-09-19 07:03:56.281 | POINT (-3.7719599008733478 40.52679600981478) | 13.524692636452208| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | 1962 | ES | user_1962 | big data gives organizations 1962 | 2018-12-23 17:49:08.281 | POINT (-3.786811904736386 40.379710208662516) | 8.14941336550081| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | 1621 | ES | user_1621 | big data gives organizations 1621 | 2018-12-16 16:04:36.281 | POINT (-3.9426423116227083 40.34428790575111) | 21.778156859152915| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | 1331 | ES | user_1331 | big data gives organizations 1331 | 2018-12-11 17:08:11.281 | POINT (-3.5028367241014378 40.393159496015976) | 17.216759410938533| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+
It is also possible to sort the results by distance to a geographical position:
-- fetch all nodes, all partitions SELECT *, PUBLIC.ST_DISTANCE_SPHERE(place, 'POINT (-3.703790 40.416775)')/1000 as distance_km FROM "tweets".tweet WHERE lucene = '{ filter: [ {type: "range", field: "time", lower: "2018/12/1", upper: "2020/12/30"}, {type: "prefix", field: "user", value: "user_1"}, {type: "geo_distance", field: "place", latitude: 40.416775, longitude: -3.703790, max_distance: "20km"}, {type: "match", field: "countryCode", value: "ES"} ], query: {type: "phrase", field: "body", value: "big data gives organizations", slop: 1}, sort: [ {field: "place", type: "geo_distance", latitude: 40.416775, longitude: -3.703790} ] }' limit 10;
+------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | ID | COUNTRYCODE | USER | BODY | TIME | PLACE | DISTANCE_KM| +======+=============+============+====================================+=========================+================================================+===================+ | 1962 | ES | user_1962 | big data gives organizations 1962 | 2018-12-23 17:49:08.281 | POINT (-3.786811904736386 40.379710208662516) | 8.14941336550081| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ |10661 | ES | user_10661 | big data gives organizations 10661 | 2020-09-19 07:03:56.281 | POINT (-3.7719599008733478 40.52679600981478) | 13.524692636452208| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+ | 1331 | ES | user_1331 | big data gives organizations 1331 | 2018-12-11 17:08:11.281 | POINT (-3.5028367241014378 40.393159496015976) | 17.216759410938533| +------+-------------+------------+------------------------------------+-------------------------+------------------------------------------------+-------------------+
Tip
Take a look to Affinity Collocation to improve search performance.
-
Conceptually derived from Stratio's Lucene based secondary indexes for Cassandra. We have maintained a full search syntax compatibility with Stratio's Lucene based secondary indexes for Cassandra, so you will see both manuals are pretty similar. This syntax compatibility is quite useful if you use Apache Cassandra with Stratio's Lucene based secondary indexes for Cassandra as a 3rd Party CacheStore Persistence to exchange lucene queries transparently between Apache Ignite SQL and CQL. Requirements to exchange lucene queries transparently between Apache Cassandra and Apache Ignite:
- Both Apache Cassandra and Apache Ignite schemas must be compatibles.
- Queries must not contains specific QL functions.
- Must use dummy 'lucene' indexed column.
- Lucene Index schemas must be equals.