代码之家  ›  专栏  ›  技术社区  ›  George Armhold

使用谷歌应用引擎和JDO进行全文搜索?

  •  5
  • George Armhold  · 技术社区  · 15 年前

    我用JDO使用谷歌AppEngine(Java)。我如何做JDO等价于

    select * from table where field like '%foo%'
    

    到目前为止,我看到的唯一建议是使用Lucene。我有点惊讶,这种基本的东西是不可能在开箱即用的GAE。

    2 回复  |  直到 12 年前
        1
  •  6
  •   Nick Johnson    15 年前

    你不能在应用引擎上做这种子字符串搜索。原因是应用引擎数据存储被构建成可伸缩的,并且拒绝执行任何它不能满足索引的查询。对这样的查询进行索引几乎是不可能的,因为它需要搜索每个记录的“field”属性的整个匹配项。运行此查询的任何关系数据库都将通过执行完整的表扫描并分别检查每个记录(至少可以说是不可伸缩的)来执行查询。

    正如您已经发现的,解决方案是使用全文索引,如Lucene。有一些库可以在应用程序引擎上运行Lucene,例如 GAELucene .这也为您提供了正确的全文搜索的能力,而不是简单的子字符串匹配。

        2
  •  1
  •   Tom Clift    12 年前

    DR :管理自己的多值搜索属性并对其执行等于查询。

    细节: 对于那些寻找简单和DIY的人,您可以执行以下操作:

    1. 在您的实体上,创建多值 searchTerms 财产。这将包含实体的可搜索项。

    2. 将实体的可搜索文本拆分为单词。这些词将是实体唯一可搜索的部分。您可以先在空白处进行拆分,或者添加一些基本的词干。例如,在处理电子邮件地址时,您可能希望将用户和域部分分开放置,以便两者都可以被搜索。如果您的实体已更新,则需要重新生成此属性。

    3. 要执行搜索,请将搜索输入拆分为单词(如果需要,执行基本词干),并使用equals运算符将每个词干作为筛选器添加到 检索词 财产。

      (The = 多值属性上的运算符询问 任何 值等于筛选器。)

      例如(使用) Objectify ):

      Query query = dao.ofy().query(Recipe.class);
      for (String term : search.toLowerCase().split(" ")) {
        query = query.filter("searchTerms =", term);
      }