我正在为我的网络应用程序测试Amazon Cloudsearch
,我遇到了一些奇怪的问题。
我有以下域索引:name
,email
,id
。
例如,我有以下数据:John Doe,John @ example.com,1
当我搜索jo
时,我什么都没得到。如果我搜索joh
我仍然什么都没有,但如果我搜索john
然后我得到上面的文件作为一个命中。当我放置部分字符串时为什么没有得到?我甚至在启用模糊匹配的name
和email
上添加了推荐器。还有别的东西我不见了吗?我在下面看到了这个:
http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-text.html
http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching.html
http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-compound-queries.html
我正在使用boto以及AWS页面上的表单进行搜索。
你想要做什么 - 通过搜索“jo”找到“john” - 被称为前缀搜索。
您可以通过搜索完成此操作
(prefix field=name 'jo')
要么
q=jo*
请注意,如果您使用q=jo*
方法将*附加到您的所有查询中,您可能需要执行类似q=jo* |jo
的操作,因为john*
与john
不匹配。
这看起来有点令人困惑,但想象一下,如果谷歌给出了前缀匹配的结果:如果你搜索了侵权行为并找回了关于陆龟和酷刑而不是侵权(法律术语)的一堆结果,你会非常困惑(并且感到沮丧) )。
建议者也是一种可行的方法,但这会给你提供建议(如john
,jordan
和jostle
而不是结果),然后你需要搜索;它不会向您返回匹配的文档。
请参阅http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-text.html上的“在Amazon CloudSearch中搜索前缀”
您的索引字段类型是“文本”吗?如果他们只是“文字”,他们必须完全匹配。
我认为你必须将你的name
和email
字段设置为literal
类型而不是text
类型,否则对'jo'或'Joh'的简单文本搜索应该找到示例文档。
虽然使用前缀搜索可能已经解决了您的问题(如果字段设置为literal
类型,这是有道理的),接受的答案并不正确。它“像谷歌搜索”的概念不是基于文档中的任何内容。它实际上与他们使用的示例相矛盾,并且通常会混淆服务的可能性。来自docs:
当您搜索单个术语的文本和文本数组字段时,Amazon CloudSearch将按任意顺序在指定字段内的任何位置查找包含搜索术语的所有文档。例如,在样本电影数据中,标题字段被配置为文本字段。如果您在标题字段中搜索星标,您会发现标题字段中任何位置包含星形的所有电影,例如星球,星球大战和星星诞生。这与搜索文字字段不同,其中字段值必须与要被视为匹配的搜索字符串相同。