区分大小写不适用于Marklogic中的JSearch的小字母

时间:2020-06-28 16:03:55

标签: marklogic

对于小字母开头的单词,区分大小写在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

2 个答案:

答案 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"