Python 如何在GAE的搜索API中实现自定义拼写检查

Python 如何在GAE的搜索API中实现自定义拼写检查,python,google-app-engine,search,spell-checking,gae-search,Python,Google App Engine,Search,Spell Checking,Gae Search,在我的pythongae应用程序中,我允许用户使用搜索api查询项目,我最初在文档中放入了精确的标记,但是点击并没有给出需要显示的拼写更正。 我发现的方法是通过数据存储实现字符ngrams,因为这样可以确保用户至少正确键入单词的一部分。在数据存储上,这需要很多时间。 比如说, “你好”(分为两部分)[“你好”、“埃洛”、“地狱”、“赫尔”、“埃洛”、“罗”、“他”、“埃尔”、“ll”、“罗”] 当我搜索“helo” 标签-[“hel”、“elo”、“he”、“el”、“lo”](给出正匹配) 我

在我的pythongae应用程序中,我允许用户使用搜索api查询项目,我最初在文档中放入了精确的标记,但是点击并没有给出需要显示的拼写更正。 我发现的方法是通过数据存储实现字符ngrams,因为这样可以确保用户至少正确键入单词的一部分。在数据存储上,这需要很多时间。 比如说,

“你好”
(分为两部分)[“你好”、“埃洛”、“地狱”、“赫尔”、“埃洛”、“罗”、“他”、“埃尔”、“ll”、“罗”]

当我搜索
“helo”
标签-[“hel”、“elo”、“he”、“el”、“lo”]
(给出正匹配)

我根据与单词匹配的标签长度对它们进行排序

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

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

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

([tags-“hello world”][rank-2300][部分tags-“hell”、“ell”、“llo”、“wor”、“orl”、“rld”、“hell”、“ello”、“worl”、“world”][英语-1][西班牙语-0][法语-0][德语-0]

我可以在对语言字段进行排序的同时执行MatchScore操作吗?(每个文档仅与一种语言关联)

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

更新:在字段的
Language
属性或整个文档的
Language
属性中定义语言。例如,在这两种情况下,值都是两个字母的ISO 693-1语言代码

对于标记化搜索词(“hel”、“elo”、…),您可以使用以下答案中的模式: 另请参阅我对该答案的评论。当您希望使用最小长度的令牌(例如,仅3个以上的字母)以避免存储大小和前端实例时间时,可以使用我在此处链接的代码

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

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

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


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

我尝试了3+和4+变体,但效果不佳,主要是因为我无法划分语言。比如说,我有西班牙语、意大利语、德语、法语和英语用户。当西班牙用户搜索某个内容时,我希望他先看到与他的查询匹配的西班牙语结果,然后可能是英语或其他语言,而不是进行严格的搜索西班牙语过滤(与搜索api中的“type”一样)。是否有一种方法可以实现MatchScorer以及对每个文档可能具有二进制值的语言字段进行排序?@minocha在我注意到您在问题中如何标记示例字段后,我添加了一个注释,说明您如何标记字段或文档的语言。因为我在我的问题中只使用了与语言无关的索引应用程序(仅限德国观众),我不确定搜索API将如何处理不同语言的结果,但我相信它已经按照您希望的方式运行了。另外,搜索API将猜测搜索词的语言,然后应用神奇的语言规则来改进匹配,但我不希望搜索API只会因为不同的语言而忽略字段或文档语言。