按照搜索建议使用片段是否实用?

Practical to use snippets as search suggest?

我正在尝试在我的应用程序中实现提前输入,我得到了搜索建议,按照文档中的建议使用元素范围索引。问题是,它不适合我的用例。

用过它的人都知道,除非搜索字符串在被搜索内容的开头,否则它不会return结果。除非使用前导和尾随通配符,这不会 return 我需要的。

我在考虑,而不是简单地根据术语进行搜索,然后 return 将结果片段(在我的服务器端代码中截断)作为我预先输入的建议。

由于我没有比较性能的好方法,所以我希望了解这是否实用,或者是否太慢。

另外,因为它可能会出现在答案中,是的,我已经阅读了关于 "chunked Element Range Indexes" 的 post,但是作为 MarkLogic 的新手,我无法理解它的正面或反面,并且无法使其适应我的应用程序。

您提到您正在使用范围索引来填充您的建议,但您也可以使用单词词典。单词词典会根据标记化的字符数据而不是元素的全部值(或 json 属性)生成建议。可能值得研究一下。

或者,由于您提到了通配符,您可能会对 cts:value-match 感兴趣。它基于范围索引中的值(而不是单词)运行,但采用 wild-carded 表达式作为输入。它会比需要提取和处理实际内容的代码片段方法执行得更好。

HTH!

我写了 Chunked Element Range Indexes 博客 post,发现 last-minute 我的性能数据因索引中的一个大得惊人的文档而出现偏差。当我删除那个大文档时,许多其他技术(例如通配符匹配)突然变得更快了。这让我感到惊讶,因为我使用过的所有其他搜索引擎都无法为 type-ahead 场景提供如此快速的性能和灵活性,特别是如果我尝试引入 wild-card 搜索。我决定不公开我的 post,但其他人不小心帮我做了,所以我们决定将其保留在那里,因为它仍然提供了一个有效的选项。

由于 MarkLogic 提供了多个通配符索引,因此您可以在该领域做很多事情。但是,搜索片段不是执行此操作的正确方法,因为我认为它们会增加一些开销。调用 cts:search 或其他 cts 调用之一来匹配词典。我猜你会想要 cts:element-value-match。这会与范围索引进行通配符匹配,因为它们都在内存中,所以速度更快。如果可以的话,打开数据库上的所有通配符索引。

它应该从 MarkLogic HTTP 服务器中的自定义 XQuery 脚本调用。我不像往常那样推荐 REST 扩展,因为您需要尽可能 stream-lined 才能正确完成大多数 type-ahead 场景(即足够快)。

我建议您想方设法将范围索引中的值集减少到 100,000 以下,这样匹配的对象就更少了,并且您不会让任何垃圾建议出现。此外,请确保根据查询的其余部分过滤匹配集(如果用户已经开始输入其他单词或短语)。确保您的 HTTP 脚本限制返回的建议数量,因为用户通常无法从一长串建议中获益。并制定一些算法来对建议进行排名,以便最有帮助的建议排在首位。最后,要非常非常小心,不要提出那些比帮助更分散注意力的建议。如果您要为您的用户提供 type-ahead,它会打断他们的搜索和 train-of-thought,所以如果您要建议不会帮助他们得到什么的搜索词组,请不要打扰他们他们要。我经常看到这种方式,甚至在主要网站上也是如此。不要这样做 type-ahead,除非您愿意衡量该功能的使用情况,并随着时间的推移对其进行调整,或者在它分散用户注意力时将其删除。

希望对您有所帮助!