Как связать запросы SQL, Text и сканирования в Apache Ignite - PullRequest
0 голосов
/ 07 ноября 2018

У нас есть кластерный кэш Ignite, в котором мы можем хранить огромное количество данных (более 100 миллионов записей). В настоящее время мы используем запросы SQL для поиска записей с использованием индексов. Но у нас есть требование для некоторых бесплатных текстовых поисков, и мы планировали оценить, как могут работать текстовые запросы. Свободный текстовый поиск будет связан с некоторыми ограничениями SQL, поэтому набор данных результата не будет огромным. Я надеялся найти способ использовать текстовый поиск и, возможно, сканирующий поиск по результатам поиска SQL (который, я думаю, мог бы дать гораздо большую гибкость и мощь для структуры запросов Ignite). Есть ли способ добиться этого. В нашей системе мы используем встроенное постоянство и реплицируемый кеш.

1 Ответ

0 голосов
/ 07 ноября 2018

Все виды запросов - Scan, SQL и Text - независимы друг от друга. Вы не можете напрямую использовать SQL поверх результата текстового запроса.

Вы можете попытаться выполнить локальные текстовые запросы на всех узлах, а затем отфильтровать результаты вручную (не используя SQL, а просто код Java). Э.Г.

    Collection<List<Cache.Entry<Object, Object>>> results = ignite.compute().broadcast(() -> {
        IgniteCache<Object, Object> cache = Ignition.localIgnite().<Object, Object>cache("foo");
        TextQuery<Object, Object> qry = new TextQuery<Object, Object>(Value.class, "str").setLocal(true);
        try (QueryCursor<Cache.Entry<Object, Object>> cursor = cache.query(qry)) {
            return StreamSupport.stream(cursor.spliterator(), false)
                .filter(e -> needToReturnEntry(e))
                .collect(Collectors.toList());
        }
    });
    List<Cache.Entry<Object, Object>> combinedResults = results.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

needToReturnEntry(e) здесь необходимо реализовать такую ​​же фильтрацию, как и ограничения SQL.

Другой способ - получить список первичных ключей из текстового запроса, а затем добавить его в запрос SQL. Это будет работать, если количество клавиш не слишком велико.

select * from TABLE where pKey in (<keys from Text Query>) and <other constraints>
...