对于小字母开头的单词,区分大小写在jsearch marklogic中不起作用。 我在下面的代码中尝试使用jsearch.documents()在marklogic中进行区分大小写的搜索。
奇怪的是,它适用于大写字母,但不适用于小写字母。
下面的示例:代码片段适用于 value =“ Rabbit” ,但不适用于 value =“ rabbit”
注意:数据库中启用了区分大小写的快速搜索
'use strict';
/* make sure fast case sensitive searches are enabled in the database
* create 3 documents, then run 2 jsearches, one with
* rabbit and one with Rabbit, printing out the search estimates
*/
declareUpdate();
const jsearch = require("/MarkLogic/jsearch.sjs")
xdmp.documentInsert('/1.json',{species:'rabbit'},{collections : "testCollection"})
xdmp.documentInsert('/2.json',{species:'Rabbit'},{collections : "testCollection"})
xdmp.documentInsert('/3.json',{species:'Rabbit'},{collections : "testCollection"})
let value = "rabbit"
//let value = "Rabbit"
let query = cts.andQuery([
cts.jsonPropertyWordQuery("species", value, ["case-sensitive","lang=en"], 3),
cts.collectionQuery("testCollection")
], [])
let result = jsearch.documents().
where(query).
slice(0,2).
map({
snippet: true
}).
result()
result.estimate
“兔子”的错误结果返回3,应为1。
我提到 result.estimate 只是为了参考返回的值的数量,但我们还需要返回文档结果 result.results
答案 0 :(得分:3)
这是我认为实际上正在发生的事情。 MarkLogic的区分大小写的单词索引不存储完全小写的单词的条目。这种有意的决定使区分大小写的单词索引小得多(因为它只需要存储具有大写字母的单词的条目)。
那么,如果对全小写的单词进行区分大小写的搜索会怎样?然后,数据库对该单词使用不区分大小写的术语列表。这将包括带有大小写的单词的版本(如您所见),但是可以在过滤过程中扔掉那些版本。这就是数据库具有过滤功能的原因。
尽管如此,估计值还是很高的,因为将包括带有大小写的单词。这就是为什么将其称为估算而不计数的原因之一。
我相信使用JSearch时,默认行为是未过滤的,因此您看到了额外的结果。使用cts.search可以过滤默认行为,因此Fiona的示例代码将删除这些多余的结果。
要解决结果问题,可以在JSearch调用中添加一个filter子句,当您知道索引需要一点帮助以达到准确性时,这是个好主意。
https://docs.marklogic.com/guide/search-dev/javascript#id_39247
答案 1 :(得分:1)
MarkLogic Search默认情况下是区分大小写的。 如果搜索的文本全部为小写字母,则MarkLogic将执行不区分大小写的搜索;否则,将执行不区分大小写的搜索。如果搜索的文本包含大写字母,则执行区分大小写的搜索。 (英文单词的大写字母源于其自身)。
如果您希望使用
options
来 更改 默认机制,则必须使用搜索jsearch
来约束查询。 但是,jsearch
不支持 完整 搜索API属性和/或查询选项。您在cts.search
中应用所需搜索选项的余地有限。例如,jsearch
以下选项对cts.search(cts.jsonPropertyValueQuery("species", "rabbit", "case-sensitive"));
中构造的查询无效:
jsearch
如果您选择
let query = cts.andQuery([ cts.jsonPropertyWordQuery("species", "Rabbit", "case-sensitive"), cts.collectionQuery("testCollection") ]) let result = jsearch.documents() .where(query) .filter() .result() result.results;
,则下面应该返回期望的结果:
{
"index": 0,
"uri": "/1.json",
"score": 43008,
"confidence": 0.566326320171356,
"fitness": 0.677866637706757,
"document": {
"species": "rabbits"
}
}
结果:
kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable?ref=master"