2017-01-30 2 views
0

Рассмотрим следующие документы и считают, что создан индекс полнотекстового над следующими документами:Couchbase Полный поиск текста с помощью комбинации динамических полей и N1QL

{ 
    email : "A", 
    "data" : { 
     "dynamic_property" : "ANY_TYPE", 
     "dynamic_property2" : { 
      "property" : "searchableValue" 
     }, 
     "field" : "VALUE" 
    } 
}, 
{ 
    email : "B", 
    "data" : { 
     "other_dynamic_prop" : "test-searchableValue-2", 
    } 
}, 
{ 
    email : "A", 
    "data" : { 
     "thirdDynamicProp" : { 
       "childProp" : "this should be searchableValue!" 
     } 
    } 
} 

Цель: Создать N1QL запрос, который будет соответствовать все документы связанные с данными email адрес И Свойство data содержит заданную подстроку.

В основном следующие:

SELECT * FROM `bucket` WHERE `email` = 'A' AND `data` LIKE '%searchableValue%'; 

Ожидаемый результат является первым и вторым документом, поскольку соответствующих критериев. Но запрос не работает, потому что данные не текстовый тип, а Тип объекта. Если data свойство было бы как:

{"data" : "this should be searchableValue!" } 

Запрос будет возвращать ожидаемый результат.

Вопрос: Как создать такой запрос N1QL, который вернет ожидаемый результат?


Я знаю, что Couchbase не в состоянии сделать сравнение подстроки в тексте, но с использованием полнотекстового индекса должно быть возможным, так как Couchbase 4.5+

+0

Все версии Couchbase начиная с версии 4.0 может ответить на ваш запрос. Как сказал @prasad, Couchbase 4.6 может ответить на ваш запрос, используя индекс TOKENS и слегка измененный запрос, используя ANY ... SATISFIES ... для соответствия индексу. – geraldss

+0

Я использую Couchbase 4.5. Как вы это сделаете в версии 4.5 без использования полнотекстового индекса? –

ответ

1

Вот конкретные запросы, основанные на ответе от @prasad.

Использование Couchbase 4.5:

CREATE INDEX idx_email ON `bucket`(email); 

SELECT * 
FROM `bucket` 
WHERE 
    `email` = 'A' 
    AND ANY t WITHIN `data` SATISFIES t LIKE '%searchableValue%' END; 

Использование Couchbase 4.6:

CREATE INDEX idx_email ON `bucket`(email); 

CREATE INDEX idx_tokens ON `bucket`(DISTINCT ARRAY t FOR t IN TOKENS(`data`) END); 

SELECT * 
FROM `bucket` 
WHERE 
    `email` = 'A' 
    AND ANY t IN TOKENS(`data`) SATISFIES t = 'searchableValue' END; 
+0

'Использование Couchbase 4.5:' Вы не указали какой-либо индекс в поле 'data'. Как его можно искать? Как насчет поиска подстрок? Это просто заставляет меня создавать индекс. * «Нет основного индекса на клавиатуре». * –

+0

Создал ли индекс индекс по электронной почте? – geraldss

+0

Да, я создал индекс. –

2

Couchbase4.6 и 5,0 больше/лучше варианты (поясняется ниже). В couchbase4.5, вы можете использовать при индексировании массива, чтобы решить эту проблему:

https://developer.couchbase.com/documentation/server/4.5/n1ql/n1ql-language-reference/indexing-arrays.html

https://www.couchbase.com/blog/2016/october/n1ql-functionality-enhancements-in-couchbase-server-4.5.1

Например, используя travel-sample образец ведро, следующий индекс массива, и запрос будет делать вид поиска подстроки вы хотите.

create index tmp_geo on `travel-sample`(DISTINCT ARRAY x FOR x IN object_values(geo) END) where type = "airport"; 

select meta().id, geo from `travel-sample` where type = "airport" 
and ANY x IN object_values(geo) SATISFIES to_string(x) LIKE "12%" END; 

N1QL ввел функцию СИМВОЛЫ() в 4.6, которые могут помочь вам создать функциональный индекс лексических подобъектов (вместо индекса массива в приведенном выше примере):

https://developer.couchbase.com/documentation/server/4.6/n1ql/n1ql-language-reference/string-functions.html

https://dzone.com/articles/more-than-like-efficient-json-search-with-couchbas

И у разработчика Couchbase 5.0 (https://blog.couchbase.com/2017/january/introducing-developer-builds) есть функция N1QL CURL(), которая позволяет вам получить доступ к любой конечной точке HTTP/REST как часть запроса N1QL (отсюда можно получить доступ к FTS endpoin т). Смотрите следующие блог для получения более подробной информации & примеров: - https://blog.couchbase.com/2017/january/developer-release--curl-n1ql - https://dzone.com/articles/curl-comes-to-n1ql-querying-external-json-data

Btw, вы можете уточнить, если вы хотите частичные жетоны или только полные маркеров в запросе?

-Prasad

+0

Мне нужно использовать Couchbase 4.5. И мне не только нужно искать в массивах, но и в динамических объектах. –

Смежные вопросы