java - 在 MarkLogic 中查询具有包含给定字符串的 JSON 属性值的文档

标签 java marklogic nosql

我使用的是 MarkLogic 7.0,java-client-api 2.0.5。

比方说,我有以下文件

{"id": 233457657, "message": "8=FIX.4.3 9=118 35=A 34=1 49=ABCMKD"}

我想在将例如 "34=1 49=ABC" 连同具有带有此类子字符串的消息值的其他文档传递给查询时选择它。我应该如何构建查询?

我尝试了以下方法,但似乎没有达到我的预期:

new StructuredQueryBuilder().term("*" + substring + "*");

我知道这可能是一个非常基本的问题,但我对机器学习还很陌生,对文档有点困惑。 谢谢!

最佳答案

通用索引存储来自属性值的单词。默认情况下,单词是连续的数字或字母(即由空格或标点符号分隔)。

在上面的示例中,消息属性索引中的默认单词为:

8, FIX, 4, 3, 9, 118, 35, 1, 49, ABCMKD

您可以在 message 属性中查询此类词的 and 相关组合,如:

qb.and(
  qb.word(qb.jsonProperty("message"), "34"),
  qb.word(qb.jsonProperty("message"), "1"),
  qb.word(qb.jsonProperty("message"), "49"),
  qb.word(qb.jsonProperty("message"), "ABCMKD")
  )

这可能会匹配许多您不感兴趣的消息。

使这些文档可查询的第一步是将隐藏在消息字符串中的字段公开为 JSON 属性:

{"id": 233457657, "message": {
    "m8": "FIX.4.3",
    "m9": "118",
    "m35": "A",
    "m34": "1",
    "m49": "ABCMKD"
    }}

然后您可以使用 qb.value() 查询分别匹配这些属性。

如有必要,您可以配置数据库以支持对这些属性的值使用通配符。

最后,如果可能的话,您应该升级到 MarkLogic 8,它原生支持 JSON。 MarkLogic 6 和 7 通过内部转换为 XML 来支持 JSON,但性能不佳。


另外回复评论...

如果上面显示的与相关的词查询很少有误报,您可以在客户端过滤掉它们——也就是说,查询比您需要的更大的文档页面,检查客户端的 message 属性一个正则表达式,并丢弃不需要的文件。

如果该方法存在太多误报,您可以使用管理 UI 在为 JSON 属性存储的消息 XML 元素上创建字段索引。 (使用查询控制台探索数据库并找出 XML 的 namespace 。)在 Field 索引中,关闭词干搜索、短语搜索、区分大小写和区分变音符号的搜索。打开单词、尾随通配符和一个字符搜索。 (不要打开位置。)

重建索引后,对该字段进行词查询,类似:

String wordQueryOptions =
  {"punctuation-sensitive", "space-sensitive", "wildcarded"};
...
qb.and(
  qb.word(qb.field("yourMsgField"), FragmentScope.Documents,
    wordQueryOptions, "34=1"),
  qb.word(qb.field("yourMsgField"), FragmentScope.Documents,
    wordQueryOptions, "49=ABC*")
  )

最后,修改用于查询的查询选项,将“已过滤”指定为搜索选项。

希望对你有帮助,

关于java - 在 MarkLogic 中查询具有包含给定字符串的 JSON 属性值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515019/

相关文章:

java - JAXB SCD 无法与 annox 一起使用

marklogic - 如何查询特定 uri 上的 MarkLogic?

Marklogic 将空节点传递给 xquery 函数

sorting - 在 Cassandra 中以不同方式或顺序查询表

java - Orientdb无法在docker容器内插入数据

mongodb - NoSQL(Cassandra/Mongodb)与 RDBMS

java - 从 Bittorrent 的 DHT Bootstrap 获取困惑回复

java - Oracle Type4 驱动程序的 ClassNotFoundException

java - MongoDB - 尝试替换数组中的值

marklogic - 仅通过传递部分节点名称获取子节点的 XPath