我正在使用 Google App Engine (Java) 和 JDO。我怎样才能做相当于JDO的事情

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

到目前为止我看到的唯一推荐是使用 Lucene。我有点惊讶的是,这种基本的功能在开箱即用的 GAE 上是不可能实现的。

有帮助吗?

解决方案

您不能这样做串那样在App Engine上的搜索。这样做的原因是,App Engine数据存储是建立在可扩展性,并拒绝执行它不能与索引满足任何查询。索引这样的查询几乎是不可能的,因为这需要搜索每个记录的“场”属性的全部内容为匹配。您在运行此查询任何关系型数据库将通过执行全表扫描,并逐一检查每个记录执行它 - 不可扩展的,至少可以说

在解决方案,因为你已经找到了,就是利用全文索引,如Lucene的。有库App Engine上运行的Lucene,如 GAELucene 。这也为您提供了适当的全文搜索的力量,而不是天真的子串匹配。

其他提示

太长了;博士:管理您自己的多值搜索属性并对其执行等于查询。

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

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

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

  3. 要执行搜索,请将搜索输入拆分为单词(如果需要,执行基本词干提取),然后使用等于运算符将每个单词添加为过滤器 searchTerms 财产。

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

    例如。(使用 客观化):

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top