我的目标是尝试使用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..."
}]
我的爪哇接口
第一种选择
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"进行搜索
返回所有文章。那不是我想要的。按权利,只应返回第 1 条。逻辑似乎是正确的,但查询似乎不起作用。
所以我尝试了另一种选择来测试是选项问题还是我的数据问题。
第二种选择
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);
我使用以下术语进行了测试:
- ">你好",所有结果都按预期返回。
- ">worl",预期返回所有结果,但没有返回
- ">world",预期返回所有结果,但只返回第 2 条和第 3 条
因此,总而言之,如上所述,我的目标是进行通配符搜索。理想的结果是:
- ">wor",返回所有结果。
此外,在搜索过程中是否有任何方法可以忽略"%20"?
要理解的是,您在此处进行搜索,而不是子字符串匹配。要理解的另一件事是,%20 在存储在文档中时只是一个标点符号和一些数字。这并不意味着空间。
第二个查询更容易理解:它说"给我所有包含这个词的文档"。什么算作一个单词取决于文档中的内容如何根据该文档的语言进行标记。
所以这里有:hello + % + 20world1,hello + world + 2,hello + world + 3 所以hello匹配所有三个,世界匹配第二个和第三个,而worl不匹配任何一个,因为这个词没有出现在任何一个中。
通配符查询的结果在很大程度上取决于索引设置。缺少正确的索引可能会在未编制索引的搜索中出现误报。查看查询计划会根据可用的索引告诉您它正在尝试执行的操作。您需要启用 3 个字符索引和一个带有代码点排序规则的单词词典,然后我将其作为通配符单词查询而不是值查询运行。