我需要在一个集合中为json文档创建分页搜索。 文件结构:
{
"Id": "OBJ-0000",
"Title": "sample text",
"Visible": true
}
我在字段Id,Title和Visible以及搜索选项xml配置:
上创建了元素范围索引<?xml version="1.0" encoding="UTF-8"?>
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:constraint name="id">
<search:range facet="false" type="xs:string">
<search:json-property>Id</search:json-property>
</search:range>
</search:constraint>
<search:constraint name="title">
<search:range facet="false" type="xs:string">
<search:json-property>Title</search:json-property>
</search:range>
</search:constraint>
<search:constraint name="visible">
<search:value type="boolean">
<search:json-property>Visible</search:json-property>
</search:value>
</search:constraint>
<search:operator name="sort">
<search:state name="idAsc">
<search:sort-order direction="ascending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
<search:state name="idDesc">
<search:sort-order direction="descending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
<search:state name="titleAsc">
<search:sort-order direction="ascending">
<search:json-property>Title</search:json-property>
</search:sort-order>
<search:sort-order direction="descending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
<search:state name="titleDesc">
<search:sort-order direction="descending">
<search:json-property>Title</search:json-property>
</search:sort-order>
<search:sort-order direction="descending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
<search:state name="isvisibleAsc">
<search:sort-order direction="ascending">
<search:json-property>Visible</search:json-property>
</search:sort-order>
<search:sort-order direction="descending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
<search:state name="isvisibleDesc">
<search:sort-order direction="descending">
<search:json-property>Visible</search:json-property>
</search:sort-order>
<search:sort-order direction="descending">
<search:json-property>Id</search:json-property>
</search:sort-order>
</search:state>
</search:operator>
<search:return-results>true</search:return-results>
<search:return-metrics>false</search:return-metrics>
<search:transform-results apply="raw">
</search:transform-results>
<search:debug>false</search:debug>
</search:options>
之后,我参考选项文件创建了POST请求:
LATEST/search?format=json&pageLength=20&start=1&options=objectSearch
结构化查询:
{
"query": {
"operator-state": {
"operator-name": "sort",
"state-name": "TitleAsc"
},
"and-query": {
"term-query": { "text": "*exam*" }
}
}
}
它有效。但是,当我使用参数 start = 1 进行查询时,在“total”中我得到的结果比实际情况要多,但如果我指定例如,start = 20 ,正确计算“total”。仅当我在搜索词中首先使用带有通配符(*)的搜索参数且术语包含多于3个字符时才会发生这种情况。 我如何解决这个问题?
答案 0 :(得分:2)
来自文档:
https://docs.marklogic.com/search:search
search:search的输出返回一个元素,该元素又包含一个total属性。总属性的值是基于查询的索引分辨率的估计值,并且不会过滤精度。索引解析的准确性取决于数据库的索引配置,查询以及搜索的数据。
这意味着只有在为您的查询启用了所有必要的索引时,才会收到准确的总数。
在此处使用推荐的通配符索引设置可帮助您获得准确的总计:https://docs.marklogic.com/guide/search-dev/wildcard#id_14163
从上面的评论中,您似乎在代码点排序规则中缺少单词词典。