Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python在GAE中进行子字符串搜索?_Python_String_Google App Engine_Search - Fatal编程技术网

使用python在GAE中进行子字符串搜索?

使用python在GAE中进行子字符串搜索?,python,string,google-app-engine,search,Python,String,Google App Engine,Search,我有一个模型,看起来像这样: class Search (db.Model) : word = db.StringProperty() 示例“word”可以类似于word=“thisisaword” 我想搜索所有实体,搜索子字符串,如“this”“isa”等 如何使用python在应用程序引擎中实现这一点 更新: 这里的单词将是域名。我猜这个词的大小是有限制的。e、 google.com,facebook.com 我想显示“google.com”,当有人搜索没有分词的“gle”时,我不认为

我有一个模型,看起来像这样:

class Search (db.Model) :

 word = db.StringProperty()
示例“word”可以类似于word=“thisisaword”

我想搜索所有实体,搜索子字符串,如“this”“isa”等

如何使用python在应用程序引擎中实现这一点

更新:

这里的单词将是域名。我猜这个词的大小是有限制的。e、 google.com,facebook.com


我想显示“google.com”,当有人搜索没有分词的“gle”

时,我不认为你想要的任务是可行的(在许多数据库引擎中,它会隐式地不使用任何索引,破坏性能和可伸缩性,但App Engine只是没有实现“功能”这不可避免地会破坏可扩展性和性能)。如果你有分词功能,你可以使用基本的全文搜索,但是,正如那篇博客所说

它没有精确的短语匹配, 子字符串匹配,布尔运算符, 词干分析或其他常见全文 特征

被称为“替代”和“类似”的项目,该项目由同一作者命名为
gae search
(免费版和付费版都有,也许付费版可以帮助你,我从来没有深入调查过。我给的最后一个链接有作者的联系方式,如果你的预算足够资助这样一个昂贵的项目,他们可能很乐意为你开发一些东西)

问题是,每个给定字符串的子字符串的数量随字符串的长度呈二次增长,因此,合理快速搜索所需的无界类型的索引也会以极快的速度增长。如果要存储的字符串和要存储的字符串的长度有界,则可以应用一些优化搜索,但它仍然是一个相当困难的问题,以任何半途而废的效率来解决

也许你可以准确地解释你试图通过这个假设的“任意子字符串搜索”获得什么,这样就可以评估字符串(以及正在搜索的子字符串)的长度和数字限制。如果你的数字限制不严格,你想解决的确切问题也许是(正如您目前所表达的问题,似乎没有任何限制——但希望情况并非如此!-),可能无法实际解决,但可能会有一些变体/子集……但您需要解释所讨论的确切问题,以允许可能会得到帮助的人考虑此类子集和变体

编辑:在OP对Q的编辑中有一点澄清,我建议的启发式方法是选择一些合理的最大和最小“相关子字符串长度”(比如2和5,称它们为MINRSL和MAXRSL以确定)。当输入字符串(域名)时,如果合适,用点将其拆分(例如,您不希望允许“跨”点搜索),可能会丢弃某些部分(您不希望显式记录所有
.com
.org
&c后缀,是吗?无论如何,此决定是特定于应用程序的),并且,对于您希望搜索的每个其他部分,对长度为MINRSL到MAXRSL的子字符串进行索引

具体来说,根据上面给出的限制2和5,并假设可以删除
www.
.com
(很像在全文搜索中通常删除“and”、“the”、“of”等词:例如“停止词”太常见了,搜索它们——作为对索引它们的巨大成本的回报——将返回无用的大量无关文档),你将不得不考虑为索引:

go oo og gl le
goo oog ogl gle
goog oogl ogle
googl oogle
因此,您需要创建一个模型的5+4+3+2=14个实例,该模型的一个字段是可索引的,另一个字段是对存储在
www.google.com
中的实例的引用。当然,与所有索引方案一样,这使得“编写”变得非常繁重(创建新对象,或者更糟糕的是,更改现有对象的索引部分!-)作为您为快速“读取”(搜索)所付出的代价

或者,对于更便宜的书写但更昂贵的阅读(搜索),您可以只记录某个单一长度的子字符串,例如4——这将只是(理想情况过于简化,请参见下文):

i、 e.所述辅助模型的三个实例,而不是十四个。但现在,为了进行搜索,您需要将正在搜索的子字符串截断为四个字符,获取所有包含一些误报的匹配项,并在您的应用程序中使用额外的代码来过滤由此找到的“可能的命中”,以消除误报


当用户搜索一个较短的字符串时,比如说“oo”,你可以找到所有以“oo”开头的匹配项(通过在搜索中同时使用
=
=
“oo”,但也可以使用
,不分词,我认为你想要的任务是不可行的(在许多数据库引擎中,它会隐式地不使用索引,破坏性能和可伸缩性,但App Engine并没有实现不可避免地破坏可伸缩性和性能的“功能”)。如果你有分词,你可以使用基本的全文搜索,但正如该博客所说

它没有精确的短语匹配, 子字符串匹配,布尔运算符, 词干分析或其他常见全文 特征

被称为“替代”和“类似”的项目,该项目由同一作者命名为
gae search
(免费版和付费版都有,也许付费版可以帮助你,我从来没有深入调查过。我给的最后一个链接有作者的联系方式,如果你的预算足够资助这样一个昂贵的项目,他们可能很乐意为你开发一些东西)

问题是,每个给定字符串的子字符串的数量随着s的平方增长
goog oogl ogle
gle le