我了解默认情况下地理空间查询不会添加分数,但是我发现添加适当的选项后,地理空间查询仍然不会添加分数
const jsearch = require('/MarkLogic/jsearch.sjs');
jsearch.documents()
.where(
cts.jsonPropertyGeospatialQuery("coordinates",
cts.circle(45,cts.point(-28.81354,153.2773)),
["score-function=reciprocal", "slope-factor=10.0","type=long-lat-point","units=km"]
,1.0)
)
.slice(0,100)
.map({snippet: true})
.result()
返回以下内容
{
"results": [
{
"uri": "/A/URI/5797f1514689edaf278d2f9e.json",
"index": 0,
"matches": [
{
"path": "fn:doc(\"/A/URI/5797f1514689edaf278d2f9e.json\")/object-node()",
"matchText": [
..."
]
}, ...
不包括分数。
谁能解释为什么没有分数或我怎么能得到分数?
请参阅附件中的工作区。这是对地理空间教程的更改。 我对此有以下疑问。
谁能解释为什么只有 cts.search 会将返回值集减少为一条匹配记录?
cts.uris 返回具有字段坐标的所有坐标,但不将其简化为圆圈内的文档。如果查询默认是未经过滤的,为什么要完全通过查询?
jsearch的返回结果与cts.uris相同,但我可以接受,但是为什么所有分数都为0,一个分数应该恰好位于圆心。
答案 0 :(得分:1)
应用.map({snippet: true})
时,jsearch实现将仅在这些属性的值存在且不等于0
时包括这些属性。
如果删除.map({snippet: true})
,您将在结果中看到score
,confidence
和fitness
。我怀疑您会发现它们都等于0
。
如果您仍然希望这些属性出现在结果中,则可以在事实之后有条件地将其添加:
const jsearch = require('/MarkLogic/jsearch.sjs');
let result = jsearch.documents()
.where(
cts.jsonPropertyGeospatialQuery("coordinates",
cts.circle(45,cts.point(-28.81354,153.2773)),
["score-function=reciprocal", "slope-factor=10.0","type=long-lat-point","units=km"],
1.0)
)
.slice(0,100)
.map({snippet: true})
.result();
result.results.forEach(r => ["score","fitness","confidence"].forEach(p => r[p] ? null : r[p]=0));
result;