1

在我的 python GAE 应用程序中,我允许用户使用搜索 api 查询项目,我最初在其中放入带有确切标签的文档,但考虑到需要存在的拼写更正,命中率并不高。我发现的方法是通过数据存储实现字符 ngram,因为这样可以确保用户正确输入单词的至少一部分。在数据存储上,这需要很多时间。例如,

"hello"(被分解成)["hello", "ello", "hell", "hel", "elo", "llo", "he", "el", "ll", "lo"]

当我搜索"helo" tags -["hel", "elo", "he", "el", "lo"](给出一个肯定的匹配)

我根据单词匹配的标签长度​​对它们进行排名。

在 Datastore 上,我必须单独索引这些中断字符 ngram 以及它们匹配的实体。并且对于每个单词以类似的方式对每个标签执行搜索。这需要很多时间。

有没有办法使用搜索 api 实现类似的操作。MatchScore 是否查看“OR”的多个字段?寻找设计搜索文档并在最少的操作中执行多个拼写更正查询的方法。

如果我在每个文档中都有多个语言字段,例如例如 -

([tags - "hello world"] [rank - 2300] [partial tags - "hel", "ell", "llo", "wor", "orl", "rld", "hell", "ello", "worl", "orld"] [english - 1] [Spanish - 0] [French - 0] [German - 0]

我可以在语言字段上执行 MatchScore 操作和排序吗?(每个文档仅与一种语言相关联)

4

1 回答 1

2

搜索 API是一个很好的服务,比数据存储更适合。如果您的搜索文档具有正确的语言集,搜索 API 将涵盖某些特定语言的变体(例如单数/复数)。但 Search API 仅适用于单词(通常由空格、连字符、点等分隔)。

更新:语言要么在language字段的属性中定义,要么在language整个文档的属性中定义。在任何一种情况下,该值都是由两个字母组成的 ISO 693-1语言代码,例如'de'German

对于标记搜索词(“hel”、“elo”、...),您可以使用此答案中的模式:https ://stackoverflow.com/a/13171181/1549523 另请参阅我对该答案的评论。当您想使用最小长度的标记(例如,只有 3 个以上的字母)来避免存储大小和前端实例时间时,您可以使用我在此处链接的代码。

MatchScorer 有助于对文档中给定术语的频率进行加权。由于标签通常每个文档只出现一次,因此对您没有帮助。但例如,如果您的搜索是关于在研究论文中搜索“燃烧”一词,MatchScorer 会对结果进行排名,首先显示最常包含该词的论文。

分面搜索会将所谓的分面添加到您的搜索查询的结果中,即(默认情况下)也会返回当前查询的 10 个最常出现的分面。这对标签或类别很有帮助,因此用户可以通过应用任何这些建议的过滤器来深入搜索。

如果您想向用户建议拼写正确的搜索词,使用两个索引可能是有意义的。一个索引,主索引,用于您的实际搜索文档(例如带有标签的产品描述),第二个索引仅用于标签或类别(标记化,最终使用同义词)。如果您的用户在搜索字段中键入内容,您的应用首先会查询标签索引,建议匹配的标签。如果用户选择其中之一,则该标签用于查询主搜索索引。这将帮助用户选择正确的标签。

如果有人维护这样的列表,这些标签当然可以在数据存储中进行管理,包括它们的同义词。并且每次存储标签时,您的应用程序都会更新相应的搜索文档(在二级索引中),包括所有字符 ngram(令牌)。

于 2015-10-15T12:56:32.767 回答