使用Google App Engine和JDO进行全文搜索?

时间:2009-09-30 03:44:24

标签: google-app-engine full-text-search jdo

我正在使用带有JDO的Google App Engine(Java)。我怎样才能将JDO等效于

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

到目前为止我唯一看到的建议是使用Lucene。我很惊讶在开箱即用的GAE中这种基本功能是不可能的。

2 个答案:

答案 0 :(得分:6)

您无法在App Engine上进行该类别的子字符串搜索。这样做的原因是App Engine数据存储区是可扩展的,并且拒绝执行任何索引无法满足的查询。索引此类查询几乎是不可能的,因为它需要搜索每个记录的“字段”属性的全部内容以进行匹配。您运行此查询的任何关系数据库都将通过执行全表扫描并单独检查每条记录来执行它 - 至少可以说是不可扩展的。

正如您已经发现的那样,解决方案是使用全文索引,例如Lucene。有一些用于在App Engine上运行Lucene的库,例如GAELucene。这也为您提供了正确的全文搜索功能,而不是天真的子串匹配。

答案 1 :(得分:1)

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

<强>详细信息: 对于那些寻找简单和DIY的人,您可以执行以下操作:

  1. 在您的实体上,创建一个多值searchTerms属性。这将包含实体的可搜索项目。

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

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

    (多值属性上的=运算符会询问任何值是否等于过滤器。)

    例如(使用Objectify):

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