代码之家  ›  专栏  ›  技术社区  ›  Chris Dutrow

应用程序引擎-轻松文本搜索

  •  0
  • Chris Dutrow  · 技术社区  · 16 年前

    我希望在App Engine的官方文本搜索功能发布之前,能够实现一个简单而有效的appengine文本搜索。我看到外面有一些库,但是安装新的总是很麻烦。我想知道这是不是一个有效的策略:

    2) 保存添加了这些列表的记录

    例如,如果我有一个记录:

    {
      firstName="Jon";
      lastName="Doe";
    }
    

    我可以拯救这样的财产:

    {
      firstName="Jon";
      lastName="Doe";
    
      // not case sensative:
      firstNameSearchable=["j","o", "n","jo","on","jon"];   
      lastNameSerachable=["D","o","e","do","oe","doe"];
    }
    

    //pseudo-code:
    SELECT person 
    WHERE firstNameSearchable=="jo" AND
          lastNameSearchable=="oe"
    

    这就是文本搜索的实现方式吗?你如何防止索引失控,尤其是当你有一个段落或什么的时候?有没有其他常用的压缩策略?我想如果我只是想要简单的东西,这可能行得通,但很高兴知道我可能遇到的问题。

    更新:::

    好吧,所以这个概念可能是合法的。这篇博文还提到: http://googleappengine.blogspot.com/2010/04/making-your-app-searchable-using-self.html

    下面的响应中建议的解决方案是一个很好的快速修复方法,但是由于大表的限制,只有在查询一个字段时才有效,因为在查询中只能对一个属性使用非相等运算符:

    db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2", "abc", u"abc" + u"\ufffd")
    

    我对诸如电话号码之类的数据做了一些不同的处理,在这些数据中,您可能希望搜索从开头或中间数字开始的数据。在本例中,我只是存储了以长度为3的字符串开头的整个子字符串集,因此电话号码“123-456-7890”将是:{“123”、“234”、“345”123456789“,”234567890“,”1234567890“},总计(10*((10+1)/2))—(10+9)=41个索引。。。实际上,为了删除一些不太可能使用的子字符串,我所做的有点复杂,但是你明白了。

    (Pseaudo代码) 从某人中选择 firstNameSearchIndex=“拉尔” phonenumberSearchIndex==“1234”

    app engine的工作方式是,如果查询子字符串与属性中的任何子字符串匹配,则将其视为匹配。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Drew Sears    16 年前

    实际上,这不会扩大规模。对于n个字符的字符串,需要n个阶乘索引项。一个500个字符的字符串需要1.2*10^1134个索引来捕获所有可能的子字符串。在您的实体完成对数据存储的写入之前,您将因年老而死去。

    从 the docs :

    db.GqlQuery(“从MyModel中选择* “abc”,u“abc”+u“\ufffd”)

    开始的字符串属性属性属性 和abc的角色。unicode 字符串u“\ufffd”表示 当属性值按 范围是所有开始的值 具有给定的前缀。

    推荐文章