使用 Google App Engine 索引搜索返回整个数据集

Posted

技术标签:

【中文标题】使用 Google App Engine 索引搜索返回整个数据集【英文标题】:Returning the entire dataset using Google App Engine indexed search 【发布时间】:2014-11-12 07:53:22 【问题描述】:

有没有办法在应用引擎搜索索引中获取整个数据集?下面的搜索通过QueryOptions 获取整数限制,以及始终需要存在的限制。

我无法确定是否有一些特殊标志可以绕过此限制并返回整个结果集。如果在没有QueryOptions 的情况下进行查询,则结果集以某种方式限制为20。

_INDEX = search.Index(name=constants.SEARCH_INDEX)
_INDEX.search(query=search.Query(
  query,
  options=search.QueryOptions(
      limit=limit,
      sort_options=search.SortOptions(...))))

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果您确实希望索引中的每个文档而不是查询中的每个结果https://cloud.google.com/appengine/docs/python/search/#Python_Deleting_documents_from_an_index

,您可以自定义删除所有示例
from google.appengine.api import search

def delete_all_in_index(index_name):
    """Delete all the docs in the given index."""
    doc_index = search.Index(name=index_name)

    # looping because get_range by default returns up to 100 documents at a time
    while True:
        # Get a list of documents populating only the doc_id field and extract the ids.
        document_ids = [document.doc_id
                        for document in doc_index.get_range(ids_only=True)]
        if not document_ids:
            break
        # Delete the documents for the given ids from the Index.
        doc_index.delete(document_ids)

所以你可能会得到类似的结果:

while True:
    document_ids = [document.doc_id
                    for document in doc_index.get_range(ids_only=True)]
    if not document_ids:
        break
    # Get then something with the document
    for id in document_ids:
        document = index.get(id)

您可能希望在列表理解中获取文档本身,而不是获取 ID 然后从该 ID 获取文档,但您明白了。

【讨论】:

Sweet.. 会试试这个。如果结果数量达到数万,您认为这种技术的扩展性如何? 我想取决于您需要多快重新生成结果。【参考方案2】:

首先,如果您查看 QueryOptions 的构造函数,这会回答您的问题,为什么它会返回 20 个结果:

def __init__(self, limit=20, number_found_accuracy=None, cursor=None,
               offset=None, sort_options=None, returned_fields=None,
               ids_only=False, snippeted_fields=None,
               returned_expressions=None):

我认为 API 这样做的原因是为了避免不必要的结果获取。如果您需要在用户操作时获取更多结果,而不是始终获取所有结果,则应该使用偏移量。见this。

from google.appengine.api import search
...
# get the first set of results
page_size = 10
results = index.search(search.Query(query_string='some stuff',
    options=search.QueryOptions(limit=page_size))

# calculate pages
pages = results.found_count / page_size

# user chooses page and hence an offset into results
next_page = ith * page_size

# get the search results for that page
results = index.search(search.Query(query_string='some stuff',
    options=search.QueryOptions(limit=page_size, offset=next_page))

【讨论】:

是的,我读到了这个,但我需要所有结果来获取后端统计页面。不需要分页。 我不太关注您在后端统计页面上尝试执行的操作。也许如果你描述你的用例会有所帮助。我的猜测是,也许您可​​以为 limit 设置一些巨大的数字。毕竟,如果您的数据存储中充满了与搜索查询匹配的内容。我会质疑数据或搜索查询的用处。 我需要的是基本上将搜索结果转储到一个简单的 html 页面上。我认为如果没有任何效果,可以查看分页。问题是,目前,同一个统计页面从 NDB 获取文档列表。但是数据存储没有任何属性来获取统计信息页面上所需的一些新信息。然而,设计的搜索索引会获取这些额外的数据以及文档信息。这使得结果查找相当方便。否则我将不得不查看另一张或两张表以获取相同的数据并以某种方式加入它们。 @abhink 您是否知道如何强制获取所有结果,或者您是否使用了分页?我有一个需要所有结果的类似用例。 @StephanCelis 我们不得不求助于分页。尽管为了生成所需的视图,我们只是从相关的数据存储模型中获取每个实体。数据未编入索引,但仍完全存在。我记得使用 tasklet 来管理它。

以上是关于使用 Google App Engine 索引搜索返回整个数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用Google App Engine GQL查找给定半径内的所有位置

Google App Engine Datastore 中的索引和索引条目限制

使用搜索 API Python - Google App Engine 大表

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

使用 Google App Engine 时可以对模式进行文本搜索吗?

如何在 Google App Engine 中执行全文搜索?