我理解地理空间查询在默认情况下不会添加分数,但当添加适当的选项时,我发现它们仍然没有添加:
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,一个应该正好位于圆圈的中心。
发布于 2019-12-02 20:36:08
接着,问题已从我最初的答复中更新。工作空间有助于理解正在发生的事情。
您正在/location/coords上创建一个地理空间路径索引,但使用的是cts.jsonPropertyGeospatialQuery,它无法利用该索引。如果您的地理空间查询条件没有适当的支持索引,则需要依赖筛选。
相反,您应该使用cts.pathGeospatialQuery,这样它就可以利用地理空间索引来提供快速而准确的未经过滤的结果,而不必依赖于过滤。
cts.pathGeospatialQuery("/location/coords", circle, ['units=km'], 1.0)至于为什么在搜索结果中没有返回score,似乎是因为指定了不正确的选项type=long-lat-point。索引值为type=point
当我指定type=point或删除类型选项时,将返回一个非零分数.
当应用.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;https://stackoverflow.com/questions/59133331
复制相似问题