【问题标题】:What's wrong with my wildcarded custom search in Marklogic with Java API?我在 Marklogic 中使用 Java API 的通配符自定义搜索有什么问题?
【发布时间】:2018-01-23 04:19:12
【问题描述】:

我的目标是尝试在 Marklogic 上使用 Java 进行通配符搜索。

我目前在 Marklogic 的工作。

/articles/1.json
1.json:
[{
  "title":"hello%20world1",
  "content":"article content etc..."
}]

/articles/2.json
2.json:
[{
  "title":"hello world 2",
  "content":"article content etc..."
}]

/articles/3.json
3.json:
[{
  "title":"hello world 3",
  "content":"article content etc..."
}]

我的 Java API

第一选择

StructuredQueryBuilder qb = new StructuredQueryBuilder();
String[] queryOptions = {"case-insensitive","wildcarded"};
QueryDefinition queryDef = qb.value(qb.jsonProperty("title"),
                               FragmentScope.DOCUMENTS,queryOptions 
                               ,100.0,"*"+keyword+"*");
// if possible, can someone explain what does that "weight" property 
// which I set as 100.0 does?
SearchHandle resultsHandle = new SearchHandle();
queryManager.setPageLength(PAGE_SIZE_MAX);
queryManager.search(queryDef, resultsHandle,0);

我尝试使用“world1”一词进行搜索

所有文章都被退回。那不是我想要的。正确来说,只有 article1 应该被退回。逻辑似乎正确,但查询似乎不起作用。

所以我尝试了另一种方法来测试是选项问题还是我的数据问题。

第二种选择

StructuredQueryBuilder qb = new StructuredQueryBuilder();
QueryDefinition queryDef = qb.word(qb.jsonProperty("title"),keyword);
// correct me if i'm wrong, this line will mean it will take the title 
// as long as the title contains the keyword right?
SearchHandle resultsHandle = new SearchHandle();
queryManager.setPageLength(PAGE_SIZE_MAX);
queryManager.search(queryDef, resultsHandle,0);

我使用以下术语进行了测试:

  • “hello”,所有结果都按预期返回。
  • “worl”,期望返回所有结果,但没有返回
  • “world”,期望返回所有结果,但只返回第 2 条和第 3 条

因此,总而言之,如上所述,我的目标是进行通配符搜索。理想的结果是:

  • “wor”,返回所有结果。

另外,有什么方法可以在搜索过程中忽略那个“%20”吗?

【问题讨论】:

    标签: java json search wildcard marklogic


    【解决方案1】:

    要了解的是,您在这里进行搜索,而不是子字符串匹配。要理解的另一件事是 %20 在存储在文档中时只是一个标点符号和一些数字。这并不意味着空间。

    第二个查询更容易理解:它说“给我所有包含这个词的文档”。什么算作单词取决于文档中的内容是如何根据该文档的语言进行标记的。

    所以这里我们有:hello + % + 20world1、hello + world + 2 和 hello + world + 3 所以 hello 匹配所有三个,world 匹配第二个和第三个,而 worl 一个都不匹配,因为这个词没有出现在任何一个中。

    通配符查询的结果很大程度上取决于您的索引设置。缺乏正确的索引可能会让您在未索引的搜索中误报。查看查询计划将根据可用的索引告诉您它正在尝试做什么。您需要使用代码点排序规则启用 3 个字符索引和一个单词词典,然后我会将其作为通配符单词查询而不是作为值查询运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      相关资源
      最近更新 更多