在我的python GAE应用程序中,我允许用户使用搜索api查询项目,我最初将其放入具有确切标记的文档中,但是命中并不需要进行需要存在的拼写校正。 我发现的方法是通过数据存储实现字符ngram,因为这可以确保用户正确输入至少一部分单词。在数据存储区上,这需要花费很多时间。 例如,
"hello"
(已分解)["hello", "ello", "hell", "hel", "elo", "llo", "he", "el", "ll", "lo"]
当我搜索"helo"
tags -["hel", "elo", "he", "el", "lo"]
时(给出正面匹配)
我根据从单词匹配的标签的长度对它们进行排名。
在数据存储区中, 我必须将这些中断字符ngram与它们匹配的实体分开索引。并且对于每个单词以类似的方式对每个标签执行搜索。这花费了很多时间。
有没有办法使用搜索API实现类似的操作。 MatchScore是否会查看“OR”的多个字段? 寻找设计搜索文档和在最少的操作中执行多个拼写纠正查询的方法。
如果我在每个文档中都有多个语言字段,例如eg.-
([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操作以及对语言字段进行排序吗? (每个文档只与一种语言相关联)
答案 0 :(得分:2)
Search API是一项很好的服务,比数据存储更适合。如果您的搜索文档具有正确的语言集,则Search API将涵盖特定语言的特定变体(例如,单数/复数)。但Search API仅适用于单词(通常用空格,连字符,点等分隔。)。
更新:语言在字段的language
属性中定义,或在整个文档的language
属性中定义。在任何一种情况下,该值都是双字母ISO 693-1 语言代码,例如'de'
for German。
为了标记搜索词(“hel”,“elo”,...),您可以使用此答案中的模式:https://stackoverflow.com/a/13171181/1549523 另请参阅我对该答案的评论。如果您想使用最小长度的令牌(例如只有3个以上的字母)来避免存储大小和前端实例时间,您可以使用我在那里链接的代码。
MatchScorer有助于加权文档中给定术语的频率。由于标签通常每个文档只出现一次,因此无法帮助您。但是,例如,如果您的搜索是关于在研究论文中搜索“燃烧”一词,MatchScorer会对结果进行排名,首先显示最常包含该术语的论文。
分面搜索会将所谓的构面添加到搜索查询的结果中,即(默认情况下)也返回当前查询的10个最常出现的构面。这对标签或类别很有用,因此用户可以通过应用任何建议的过滤器来深入搜索。
如果您想向用户推荐拼写正确的搜索词,则使用两个索引可能有意义。一个索引,主索引,用于实际搜索文档(例如带有标签的产品描述),第二个索引用于标签或类别(标记化,最终用同义词)。如果您的用户键入搜索字段,您的应用首先会查询代码索引,建议匹配的代码。如果用户选择其中一个,则标记用于查询主搜索索引。这有助于用户选择正确的标签。
如果有人维护此类列表,那么当然可以在数据存储区中管理这些标记,包括它们的同义词。每次存储标记时,您的应用程序都会更新相应的搜索文档(在二级索引中),包括所有字符ngrams(标记)。