使用Java API在Marklogic中进行野外自定义搜索有什么问题?

时间:2018-01-23 04:19:13

标签: java json search wildcard marklogic

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

我目前在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 ",预计会返回所有结果,但不会返回
  • " 世界",预计会返回所有结果,但只返回第2条和第3条

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

  • " wor ",返回所有结果。

此外,有没有办法在搜索过程中忽略"%20"

1 个答案:

答案 0 :(得分:1)

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

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

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

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