Stratio Lucene Index 3.0.9: назначение картографа INet

Из документов для плагина индекса Stratio Lucene картограф INet выглядит интересным, но за ним не стоит много мотивации: т.е. https://github.com/Stratio/cassandra-lucene-index/blob/branch-3.0.9/doc/documentation.rst#inet-mapper.

Учитывая, что он представляет собой IP-адрес (типизированный) и поэтому отличается от простой строки, какие запросы я могу применить к нему? В частности, возможно ли сделать запрос на расстоянии?

1 ответ

Индексный преобразователь Lucene предназначен для отображения типа данных CQL inet. Единственное преимущество - сделать разбор более гибким. Например, приведены следующие данные:

CREATE TABLE t (
    pk int PRIMARY KEY,
    address inet
) ;

CREATE CUSTOM INDEX i ON t () 
USING 'com.stratio.cassandra.lucene.Index' 
WITH OPTIONS = {
  'refresh_seconds': '1',
  'schema': '{
       fields : {
          address : {type: "inet"},
          address_s : {type: "string", column: "address"}
       }
    }'};

INSERT INTO t(pk, address) VALUES (0, '::FFFF:8:8:8');

Все эти запросы найдут проиндексированную строку:

SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address", value: "::ffFF:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address", value: "::0:ffff:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address", value: "0:0:0:0:ffff:8:8:8"}}');

Тем не менее, те же запросы не будут работать с преобразователем строк:

SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address_s", value: "::ffFF:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address_s", value: "::0:ffff:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"match", field:"address_s", value: "0:0:0:0:ffff:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"wildcard", field:"address_s", value: "*:8:8:8"}}');

Кроме того, сгенерированное поле Lucene является строковым полем, поэтому для запросов с подстановочными знаками или диапазонами нет специального режима, который должен использовать расширенный формат IP-адреса и будет иметь лексикографическое поведение:

SELECT * FROM t WHERE expr(i, '{filter:{type:"wildcard", field:"address", value: "*:8:8:8"}}');
SELECT * FROM t WHERE expr(i, '{filter:{type:"range", field:"address", lower: "::FFFF:8:8:7"}}');
Другие вопросы по тегам