我有一个 MarkLogic 8 数据库:
declareUpdate();
var book0 = {
id: fn.generateId({qwe: 'book'}),
username: 'book',
password: 'pass'
};
var book1 = {
id: fn.generateId({asd: 'book'}),
username: 'user',
password: 'pass1'
};
xdmp.documentInsert(
'zz' + book0.id,
book0,
xdmp.defaultPermissions(),
['qwe']);
xdmp.documentInsert(
'xx' + book1.id,
book1,
xdmp.defaultPermissions(),
['qwe']);
所以我想使用 Node.js API 按名称查找它们:
var db = marklogic.createDatabaseClient(connection.connInfo);
var qb = marklogic.queryBuilder;
function findByName(name) {
return db.documents.query(
qb.where(
qb.collection('qwe'),
qb.value('username', name)
)
).result();
}
问题是它不仅找到 user
或 user0
,而且还找到 users
并且如果我使用用户名 创建一个文档book
它将同时找到 book
和 books
。
最佳答案
值查询通过对文本中的每个单词进行词干分析来匹配 JSON 属性的整个文本(如果启用了词干分析,这是默认设置)。
如果(如本例中)这不是您想要的,您可以执行以下任一操作:
为 JSON 属性创建字符串范围索引(如果只需要精确匹配,则使用根排序规则)
在数据库配置中启用单词搜索,并在查询中使用“unstemmed”选项。
如果您还在数据库配置中关闭了词干搜索,则不必传递该选项(并避免两种类型的索引所需的额外资源)。
要限制对特定属性的配置更改,您可以为该属性配置一个字段,而不是配置整个数据库。
有关更多背景信息,请参阅:
http://docs.marklogic.com/guide/search-dev/stemming
http://docs.marklogic.com/guide/admin/text_index
http://docs.marklogic.com/cts.jsonPropertyValueQuery?q=cts.jsonPropertyValueQuery&v=8.0&api=true
希望有帮助,
关于javascript - MarkLogic:按属性值查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023876/