如何使用Java在Marklogic数据库中创建正确的通配符查询?

r7xajy2e  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(114)

在我的Java项目中发送通配符查询时,我遇到了一个错误结果的问题。在我的Marklogic数据库中,我保存了多个具有相同结构的json文件。我想接收那些在名为“icsList”(它是字符串列表)的字段中以给定字符串开头的json。
json中的示例icsList如下所示:

  • “许可列表”:[“11.040.40”,“12.50.80”]
  • “许可列表”:[“12.50.60”]
  • “许可列表”:[“50.010.10”]

我的示例结果:
请求-字符串“50”结果-所有json(即使是icsList中没有“50”的json)
请求-字符串“50.”结果-icsList中包含“50.”的JSON(例如:“50.010.10”、“50.010.20”以及“12.50.60”)
正如我前面提到的,我的主要目标是得到所有在“icsList”字段中以给定字符串开头的json。我的次要目标是去掉请求字符串末尾的必要点。
我的代码是:
第一个
在pom.xml中,我有:

<dependency>
    <groupId>com.marklogic</groupId>
    <artifactId>marklogic-client-api</artifactId>
    <version>5.5.3</version>
</dependency>
waxmsbnn

waxmsbnn1#

如果对数据库启用双字符搜索,则可以搜索"50 *"而不是"50. *",但这可能会显著影响索引的大小和接收性能,因此可能不建议这样做。
您可能需要在数据库上启用三字符搜索尾随通配符搜索,以便能够使用"50.*""50.* *"等短通配符值进行有效搜索。
https://docs.marklogic.com/guide/search-dev/wildcard#id_39731
如果使用value()而不是单词查询来构造cts:json-property-value-query(),并在通配符值中包含.,则它将只查找以50.开头的最后一个文档。
例如,以下搜索:

cts:search(doc(), cts:json-property-value-query("icsList", "50.*"))

或:

cts:search(doc(), cts:json-property-value-query("icsList", "50* *"))

请注意,cts:json-property-value-query中值的文本内容与cts:word-query中的短语被视为相同,其中短语是属性值。因此,任何通配符和/或词干规则都被视为短语。例如,如果"hello friend"的属性值为查询启用了通配符,"he*"cts:json-property-value-query将不会匹配,因为通配符匹配不跨越单词边界,但"hello *"cts:json-property-value-query将匹配。"*"的搜索将匹配,因为"*"通配符本身被定义为匹配该值。类似地,将词干规则应用于每个术语,因此当为查询启用词干时,对"hello friends"的搜索将匹配,因为"friends""friend"匹配。

StructuredQueryBuilder sqb = new StructuredQueryBuilder();
String[] options = {"wildcarded"};
StructuredQueryDefinition queryDefinitionIcs = sqb.value(sqb.jsonProperty("icsList"),
    null, options, 1, searchText + "*");

进行数据库范围更改的另一种方法是创建一个字段,该字段具有必要的索引设置,以便于对该字段进行双字符通配符搜索。

  • 字段值搜索
  • 尾随通配符搜索
  • 双字符搜索

然后,您可以使用尾随通配符搜索字段:

cts:search(doc(), cts:field-value-query("icsList", "50* *"))

根据字段而不是jsonProperty进行搜索:

StructuredQueryDefinition queryDefinitionIcs = sqb.value(sqb.field("icsList"),
null, options, 1, searchText + "* *");

相关问题