GVKun编程网logo

在Google App Engine数据存储区中搜索以前缀开头的字符串(在google搜索引擎中,要实现字段的精确检索)

19

关于在GoogleAppEngine数据存储区中搜索以前缀开头的字符串和在google搜索引擎中,要实现字段的精确检索的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android–Goo

关于在Google App Engine数据存储区中搜索以前缀开头的字符串在google搜索引擎中,要实现字段的精确检索的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – Google App Engine – 太多数据存储读取操作、App Engine数据存储区不支持运算符OR、AppEngine:查询数据存储区中包含的记录 值、Golang-具有[]字节比较的Appengine数据存储区过滤器查询等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在Google App Engine数据存储区中搜索以前缀开头的字符串(在google搜索引擎中,要实现字段的精确检索)

在Google App Engine数据存储区中搜索以前缀开头的字符串(在google搜索引擎中,要实现字段的精确检索)

我想搜索名称以特定字符串开头的所有实体,这在数据存储区中可能吗?

我已经试过了:

q = datastore.NewQuery("Places").Filter("Name > ", "a")

但这是行不通的。

如果这不可能,您可以向我建议什么替代解决方案?BigQuery?BigTable或App Engine上的其他服务?

答案1

小编典典

这是可能的,但要结合使用两个不等式过滤器。

假设您要列出Places具有"li"前缀的列表。这可以用查询来描述,该查询列出按字典顺序列出Places的大于(或等于)"li"
小于前缀的下一个前缀。"li"``"lj"

这就是GQL的样子:

SELECT * FROM Places WHERE Name > ''li'' AND Name < ''lj''

Go中的代码如下所示:

q = datastore.NewQuery("Places").Filter("Name >", "li").Filter("Name <", "lj")

这将列出Places名称的位置,例如:

liamlisottolizst

但将排除以下名称:

abcljoiljqwerty

需要注意的一件事:小写字母和大写字母在字典顺序上是不同的,因此例如"List"小于"li"(即使"list"大于"li")!

android – Google App Engine – 太多数据存储读取操作

android – Google App Engine – 太多数据存储读取操作

我已经通过Google App Engine为我的 Android应用程序实现了在线排行榜.但在2小时后,我在“数据存储区读取操作”中达到了100%的配额.任何人都可以帮我修改我的代码以减少读取操作吗?
这是我的代码:

public class The_Big_Bang_Theory_Quiz_HighscoreserverServlet extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException {
    String game = req.getParameter("game");
    String name = req.getParameter("name");
    String pointsstr = req.getParameter("points");
    String behaviorStr = req.getParameter("behavior");
    int behavior = 0; // 0 = upload,1 = download
    if (behaviorStr != null) {
        try {
            behavior = Integer.parseInt(behaviorStr);
        } catch (NumberFormatException e) {
            behavior = 0;
        }
    }
    if (behavior == 0) {
        int points = 0;
        if (pointsstr != null) {
            try {
                points = Integer.parseInt(pointsstr);
            } catch (NumberFormatException e) {
                points = 0;
            }
        }
        if (points > 0 && name != null) {
            addHighscore(game,name,points);
        }
    } else {
        String maxStr = req.getParameter("max");
        int max = 1000;
        if (maxStr != null) {
            try {
                max = Integer.parseInt(maxStr);
            } catch (NumberFormatException e) {
                max = 1000;
            }
        }
        returnHighscores(resp,game,max);
    }
}

private void returnHighscores(HttpServletResponse resp,String game,int max) {
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key gameKey = KeyFactory.createKey("game",game);
    Query query = new Query("highscore",gameKey);
    query.addSort("points",Query.sortDirection.DESCENDING);
    List<Entity> highscores = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(max));
    for(Entity e : highscores) {
        try {
            resp.getWriter().println(e.getProperty("name") + ";" +e.getProperty("points"));
        } catch (IOException exc) {
            exc.printstacktrace();
        }
    }
}

private void addHighscore(String game,String name,int points) {
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key gameKey = KeyFactory.createKey("game",game);
    Entity highscore = new Entity("highscore",gameKey);
    highscore.setProperty("name",name);
    highscore.setProperty("points",points);
    datastore.put(highscore);
}
}

我读了一些关于BlobStore的内容.这是一种更好的方法吗?

解决方法

我有同样的问题,我使用GEA的缓存机制来解决问题.
基本上,Cache是​​分布式HasMap

一些代码:
创建地图:

try {
            cache = CacheManager.getInstance().getCacheFactory().createCache(
                    new ConcurrentHashMap<String,Category>());
        } catch (CacheException e) {
            Logger
                    .getLogger(TipsDAO.class.getName())
                    .severe(
                            "unable to cretate cache using an internal ConcurrentHashMap");
            cache = new ConcurrentHashMap<String,Category>();
        }

对于每个阅读弹出,您首先检查地图,如果您发现我返回,如果您没有找到它,您从数据库中读取并在返回之前将其放入地图中.

if (cache.containsKey(cat)) {
            return (Category) cache.get(cat);
        }
        try {
            Query query = entityManager
                    .createquery("SELECT FROM Category WHERE name = ?1");
            query.setParameter(1,cat);
            Category temp = (Category) query.getSingleResult();
            cache.put(cat,temp);
            return temp;
        } catch (Exception e) {
            LOG.severe(e.getMessage());
            return null;
        }

对于DB的每个写操作,您也可以写入Map

cache.put(cat.getName(),cat);

App Engine数据存储区不支持运算符OR

App Engine数据存储区不支持运算符OR

我正在尝试在Google数据存储区中查询类似的内容(使用pm-> persistanceManager):

String filters = "(  field == ''value'' ||  field == ''anotherValue'' )";Query query = pm.newQuery(myType.class, filters);

执行时-我回来了: App Engine数据存储区不支持运算符OR

人们对此类查询的最佳体验方法是什么?

任何帮助表示赞赏!

答案1

小编典典

执行多个查询。与其他所有数据库一样,数据存储区也无法有效执行析取。与其他数据库不同,它向用户暴露了这一困难,以明确您的工作效率不高。您唯一的解决方案是执行多个查询-
每个查询一次或-将其合并。

AppEngine:查询数据存储区中包含的记录 值

AppEngine:查询数据存储区中包含的记录 值

我在Google App Engine数据存储区中为数据库模型创建了一个新属性。

旧:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()

新:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()
  is_approved = db.BooleanProperty(default=False)

如何查询未设置“ is_approved”值的徽标记录?我试过了

logos.filter("is_approved = ",None)

但这没用。在数据查看器中,新字段值显示为。

Golang-具有[]字节比较的Appengine数据存储区过滤器查询

Golang-具有[]字节比较的Appengine数据存储区过滤器查询

我正在尝试对数据存储区中的一组实体执行过滤器查询,但是我要使用相等运算符查询的实体字段的类型为[]
byte,我不知道appengine数据存储区是否可以执行这个比较

这是我的实体:

type Data struct { Id          int64  `json:"id"` Version     int32  `json:"-"` HMAC        []byte `json:"-"` Status      string `json:"status"`}

这是我的查询逻辑

func (view *DataView) GetDataByHMAC(hmac []byte) (Data, error) {    view_key := datastore.NewKey(view.context, "View", "data-view", 0, nil)    data := make([]Data, 0)    query := datastore.       NewQuery("ViewData").       Ancestor(view_key).       Filter("HMAC = ", hmac)    _, err := query.GetAll(view.context, &data)    if err != nil {       return Data{}, err    }    if len(data) == 0 {       return Data{}, ErrNoData    }    return data[0], nil}

它可以构建但不会返回任何结果,即使经过10秒钟以编程方式重试后也是如此,因此我认为这不是数据存储与我存储在其中的视图数据之间最终一致性的问题。

我的主要问题是:appengine数据存储区是否允许查询对类型为[] byte的字段使用比较过滤器?

答案1

小编典典

您的主要问题的答案是“否”,因为[] byte存储为blob,但App Engine数据存储区未对其进行索引。

queries with a filter or sort order on the unindexed property will never match that entity.Note: In addition to any unindexed properties you declare explicitly, those typed as []byte are automatically treated as unindexed.

以下是文档:https
:
//developers.google.com/appengine/docs/go/datastore/indexes#Go_Unindexed_properties

关于在Google App Engine数据存储区中搜索以前缀开头的字符串在google搜索引擎中,要实现字段的精确检索的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – Google App Engine – 太多数据存储读取操作、App Engine数据存储区不支持运算符OR、AppEngine:查询数据存储区中包含的记录 值、Golang-具有[]字节比较的Appengine数据存储区过滤器查询等相关知识的信息别忘了在本站进行查找喔。

本文标签: