我使用以下查询来获取记录,但它正在获取误报结果。
<cts:and-query xmlns:cts="http://marklogic.com/cts">
<cts:or-query>
<cts:element-value-query>
<cts:element>type</cts:element>
<cts:text xml:lang="en">article</cts:text>
</cts:element-value-query>
</cts:or-query>
<cts:element-query>
<cts:element>body</cts:element>
<cts:word-query>
<cts:text xml:lang="en">ace???</cts:text>
<cts:option>case-insensitive</cts:option>
<cts:option>diacritic-insensitive</cts:option>
<cts:option>punctuation-insensitive</cts:option>
<cts:option>whitespace-insensitive</cts:option>
<cts:option>stemmed</cts:option>
<cts:option>wildcarded</cts:option>
</cts:word-query>
</cts:element-query>
<cts:or-query>
<cts:element-range-query operator=">=">
<cts:element>expires-on</cts:element>
<cts:value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2014-12-04T06:05:29.78Z</cts:value>
</cts:element-range-query>
<cts:not-query>
<cts:element-value-query>
<cts:element>expires-on</cts:element>
<cts:text xml:lang="en">*</cts:text>
<cts:option>wildcarded</cts:option>
</cts:element-value-query>
</cts:not-query>
</cts:or-query>
</cts:and-query>
</results>
上述查询是一个通配符查询,应该从&#34; ace&#34;开始搜索6个字母的单词。但我们也得到的结果包含超过6个字母单词,从&#34; ace&#34;开始。
以下是我们正在使用的索引
此外,我们正在使用未经过滤的&#34;执行搜索时的选项。
任何帮助将不胜感激。
由于
答案 0 :(得分:1)
您没有说出您的通配符索引设置是什么。这很重要:如果索引中没有包含正确的信息,结果就不符合您的期望。
查看https://docs.marklogic.com/guide/search-dev/wildcard以了解各种通配符索引的工作方式以及可能要启用的通配符索引。在这种情况下,我建议trailing-wildcard
,或许与element-trailing-wildcard
一起推荐。
使用某些优化策略也可以改进该查询。如果可能的话,我会element-value-query
与*
一起避免。而是使用cts:element-query($qname, cts:and-query(()))
。那做同样的工作,而且效率更高。
如果body
是一个简单的元素,那么使用element-word-query
而不是将element-query
与word-query
相结合会更有效率。如果body
很复杂 - 也就是说,如果要匹配的文本是后代元素 - 那么您可以选择使用元素查询和启用尾随通配符位置索引,还是设置element word query through对于所有后代元素。