2017-10-15 42 views
1

我正在使用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/anExample1anExample1/key1

+0

你试过什么吗?我不清楚在什么情况下你可以搜索“一二三”,并让它匹配你的第二个示例文档。 –

+0

你说得对。我的例子很糟糕,对不起。编辑。 – sjoerd999

+0

请确保也看看StructuredQueryBuilder和SearchHandle。这些可能会成为你答案的一部分。您是否阅读过Java搜索指南? http://docs.marklogic.com/guide/java/searches –

回答

1

尝试添加在你的查询字符串双引号queryMgr.newStringDefinition().withCriteria("\"one two three\"");

StringQueryDefinition查询遵循搜索指南中The Default String Query Grammar记录的规则。

1

要搜索 “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() 
+0

谢谢,这有一点帮助。不幸的是,最初的问题仍然是开放的,因为最终我想搜索确切的'标记'而不知道它匹配哪个键。我会尝试在我的数据中的任何地方附加一个额外的密钥,这些密钥在任何地方都是一样的,但这会用这个密钥污染我的原始数据。 – sjoerd999

+0

您可以考虑的另一个选择是创建一个封装可能元素列表的字段。然后你可以做上面的,但是用'sqb.field(“catchall”)'代替'sqb.element(“key1”)'。列举它们不应该是不可能的。这不会污染你的数据。 –