MarkLogic Java:将查询类型设置为StringQueryDefinition中的值
我正在使用MarkLogic Java API。我正在寻找一种方法来设置一个StringQueryDefinition的查询类型。该类型应为“值”,如https://docs.marklogic.com/guide/search-dev/searchdev#id_34905中所述。MarkLogic Java:将查询类型设置为StringQueryDefinition中的值
值:匹配特定JSON属性或XML元素中的整个文字值,例如字符串或数字。默认情况下,值查询使用完全匹配语义。例如,搜索“标记”不符合“马克吐温”。
我需要这个,因为我希望我的文本搜索仅匹配确切的搜索项。
示例:搜索'标记'只能与包含与某个键相关的术语'标记'的文档匹配。所以,{"anExample1": {"key1": "mark", "key2":"someotheralue"}}
是有效的匹配项。但{"anExample2": {"key1": "mark twain", "key2":"someotheralue"}}
不是有效匹配项。
对于这两个示例,我想获取返回的文档中的URI和位置。因此,搜索"mark"
应返回uri/anExample1
和anExample1/key1
。
尝试添加在你的查询字符串双引号queryMgr.newStringDefinition().withCriteria("\"one two three\"");
StringQueryDefinition查询遵循搜索指南中The Default String Query Grammar记录的规则。
要搜索 “KEY1”= “标记” 你会做到以下几点:
StructuredQueryBuilder sqb = new StructuredQueryBuilder();
QueryDefinition query = sqb.value(sqb.element("key1"), "mark");
SearchHandle results = queryMgr.search(query, new SearchHandle());
从结果可以得到URI:
results.getMatchResults()[i].getUri()
,比赛地点:
results.getMatchResults()[i].getMatchLocations()[j].getPath()
谢谢,这有一点帮助。不幸的是,最初的问题仍然是开放的,因为最终我想搜索确切的'标记'而不知道它匹配哪个键。我会尝试在我的数据中的任何地方附加一个额外的密钥,这些密钥在任何地方都是一样的,但这会用这个密钥污染我的原始数据。 – sjoerd999
您可以考虑的另一个选择是创建一个封装可能元素列表的字段。然后你可以做上面的,但是用'sqb.field(“catchall”)'代替'sqb.element(“key1”)'。列举它们不应该是不可能的。这不会污染你的数据。 –
你试过什么吗?我不清楚在什么情况下你可以搜索“一二三”,并让它匹配你的第二个示例文档。 –
你说得对。我的例子很糟糕,对不起。编辑。 – sjoerd999
请确保也看看StructuredQueryBuilder和SearchHandle。这些可能会成为你答案的一部分。您是否阅读过Java搜索指南? http://docs.marklogic.com/guide/java/searches –