我有一个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
的文档,它会找到{{1} }和book
。
答案 0 :(得分:2)
值查询通过阻止文本中的每个单词来匹配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
希望有帮助,