结合动态字段和N1QL的Couchbase全文搜索 考虑以下文档,并认为这是通过以下文档创建全文索引: { 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的Couchbase全文搜索 考虑以下文档,并认为这是通过以下文档创建全文索引: { 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!" } } },couchbase,n1ql,Couchbase,N1ql,目标:创建N1QL查询,该查询将匹配与给定电子邮件地址关联的所有文档,并且数据属性包含给定的子字符串 基本如下: SELECT * FROM `bucket` WHERE `email` = 'A' AND `data` LIKE '%searchableValue%'; 预期结果是第一个和第二个文档,因为匹配条件。但是查询不起作用,因为数据不是文本类型,而是对象类型。如果数据属性类似于: {"data" : "this should be searchableValue!" } 查询将返回

目标:创建N1QL查询,该查询将匹配与给定
电子邮件
地址关联的所有文档,并且
数据
属性包含给定的子字符串

基本如下:

SELECT * FROM `bucket` WHERE `email` = 'A' AND `data` LIKE '%searchableValue%';
预期结果是第一个和第二个文档,因为匹配条件。但是查询不起作用,因为数据不是文本类型,而是对象类型。如果
数据
属性类似于:

{"data" : "this should be searchableValue!" }
查询将返回预期结果

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



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

Couchbase 4.6和5.0有更多/更好的选项(解释如下)。在couchbase4.5中,可以使用数组索引来解决此问题:

例如,使用
travelsample
sample bucket、数组索引和查询将执行所需的子字符串搜索

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(),它可以帮助您在标记化的子对象上创建函数索引(而不是上例中的数组索引):

而且,Couchbase 5.0 developer build()具有N1QL函数CURL(),它允许您作为N1QL查询的一部分访问任何HTTP/REST端点(因此,可以访问FTS端点)。有关更多详细信息和示例,请参阅以下博客: - -

顺便说一句,您能否澄清在查询中是需要部分令牌还是只需要完整令牌


-Prasad

Couchbase4.6和5.0有更多/更好的选择(解释如下)。在couchbase4.5中,可以使用数组索引来解决此问题:

例如,使用
travelsample
sample bucket、数组索引和查询将执行所需的子字符串搜索

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(),它可以帮助您在标记化的子对象上创建函数索引(而不是上例中的数组索引):

而且,Couchbase 5.0 developer build()具有N1QL函数CURL(),它允许您作为N1QL查询的一部分访问任何HTTP/REST端点(因此,可以访问FTS端点)。有关更多详细信息和示例,请参阅以下博客: - -

顺便说一句,您能否澄清在查询中是需要部分令牌还是只需要完整令牌


-Prasad

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

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

自4.0以来的所有Couchbase版本都可以回答您的查询。正如@prasad所说,Couchbase 4.6可以使用令牌索引和稍微修改的查询来回答您的查询,使用任何。。。满足。。。为了匹配索引,我使用Couchbase 4.5。如果不使用全文索引,您将如何在版本4.5中执行此操作?自4.0以来的所有Couchbase版本都可以回答您的查询。正如@prasad所说,Couchbase 4.6可以使用令牌索引和稍微修改的查询来回答您的查询,使用任何。。。满足。。。为了匹配索引,我使用Couchbase 4.5。在4.5版中,如果不使用全文索引,您将如何执行此操作?
使用Couchbase 4.5:
您没有在
数据
字段中定义任何索引。它如何可以被搜索?搜索子字符串怎么样?它只是强迫我创建一个索引。“keyspace上没有主索引…”您在电子邮件上创建了索引吗?是的,我创建了索引。您得到了正确的结果吗?你必须使用准确的索引和我发布的准确查询。好的。让我们修复Couchbase论坛上的查询,然后在此处发布最终答案。
使用Couchbase 4.5:
您没有在
数据
字段上定义任何索引。它如何可以被搜索?搜索子字符串怎么样?它只是强迫我创建一个索引。“keyspace上没有主索引…”您在电子邮件上创建了索引吗?是的,我创建了索引。您得到了正确的结果吗?你必须使用准确的索引和我发布的准确查询。好的。让我们修复Couchbase论坛上的问题,然后在这里发布最终答案。我需要能够使用Couchbase 4.5。我不仅需要能够在数组中搜索,还需要能够在动态对象中搜索。我需要能够使用Couchbase 4.5。我不仅需要能够在数组中搜索,还需要能够在动态对象中搜索。