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地址ANDdata属性包含给定子字符串的文档。

基本如下:

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

由于条件匹配,预期结果是第一个和第二个文档。但是查询不起作用,因为数据是而不是文本类型,而是对象类型

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

查询将返回预期结果。

问题是:如何创建这样一个返回预期结果的N1QL查询


我知道Couchbase无法比较文本中的子字符串,但使用全文索引应该是可能的,因为Couchbase 4.5+

沙发座4.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中引入了一个函数TOKENS(),它可以帮助您在标记化的子对象上创建函数索引(而不是上例中的数组索引):

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(),它允许您作为N1QL查询的一部分访问任何HTTP/REST端点(因此,可以访问FTS端点)。请参阅以下博客了解更多详细信息&示例:-https://blog.couchbase.com/2017/january/developer-release--curl-n1ql-https://dzone.com/articles/curl-comes-to-n1ql-querying-external-json-data

顺便说一句,你能澄清一下你在查询中是想要部分令牌还是只想要完整令牌吗?

-普拉萨德

以下是基于@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;

最新更新