【问题标题】:lunr is not returning exact matching as top prioritylunr 没有将精确匹配作为首要任务返回
【发布时间】:2017-09-21 00:30:08
【问题描述】:

我在网络浏览器中使用lunr (elastic lunr0.9.5) 作为搜索引擎。 它既简单又非常快。但是当它有更多时,它不会在第一个位置列出完全匹配的对象。

我在 Typescript 中的 lunr 配置

this.lunrIndex = lunr(function () {
                this.field('itemId');
                this.field('name');
                this.ref('itemId');
                this.pipeline.remove(lunr.stemmer)
            })

当我搜索 pan d ca 文本时,它正在返回,

[{
    "ref": "PANCOR DSR CAPSULE 10''S",
    "score": 0.01674628244112235
  },
  {
    "ref": "PANLID DSR CAPSULE 10''S",
    "score": 0.01674628244112235
  },
  {
    "ref": "PANSIO DSR CAPSULE 10''S",
    "score": 0.01590146213665648
  },
  {
    "ref": "PANLIFE DSR CAPSULE 10''S",
    "score": 0.015507241586286287
  },
  {
    "ref": "PANSEC DSR CAPSULE 10''S",
    "score": 0.014526355502926632
  },
  {
    "ref": "PAN D CAPSULE 10''S",
    "score": 0.011554433713104873
  }
  ]

Lunr 修剪可能是上述结果的原因之一,所以我从其管道执行中删除了lunr.trimmer,但它仍然给出相同的结果。

以上结果显示,完全匹配字符串(PAN D C) 得分较低(0.011554433713104873)。我错过了这里的任何配置吗?

我需要精确匹配的字符串应该比其他字符串获得最高分,我该如何实现?

【问题讨论】:

  • 您使用的是 lunr 还是 elasticlunr(它们是不同的库)?
  • 抱歉给您带来了困惑 :-( 我正在使用 lunr。
  • Elastic lunr 建立在 lunr 之上,两者差别不大
  • elasticlunr 是/曾经是 lunr 的一个分支,但它们已经出现了很大的分歧。

标签: javascript json lunrjs


【解决方案1】:

Lunr(版本 0.x 和 1.x)会自动为每个搜索词附加一个通配符,因此当您搜索“pan d ca”时,您实际上会得到“pan* d* ca*”的结果,这就是为什么你会得到额外的结果。有一些逻辑试图提升精确匹配,但是,尤其是在多词搜索中,它并不总是将匹配提升到足以获得预期结果的程度。这是不可配置的。

如果可以的话,我会向 Lunr 2.x 推荐 upgrading,它可以更好地控制 searching

【讨论】:

  • 好建议,但是,0.x/1.x 和 2.x 之间最大的区别是 Lunr 索引现在是不可变的。一旦构建完成,就无法在索引中添加、更新或删除任何文档。在我的应用程序中,我需要在中间的索引中添加/更新文档。重建整个索引而不是添加/更新一些文档是非常昂贵的。这就是我稳定在 0.x 的原因
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2012-04-30
  • 2013-03-17
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多