7

我想从 cloudsearch 中检索所有可搜索的文档

我试图做一个这样的否定搜索:

search-[mySearchEndPoint].cloudsearch.amazonaws.com/2011-02-01/search?bq=(not keywords: '!!!testtest!!!')

它可以工作,但它也会返回所有已删除的文档。

那么我怎样才能只获取所有活动文档呢?

4

2 回答 2

4

要知道的关键是 CloudSearch 并没有真正删除。相反,“删除”函数会在索引中保留 ID,但会清除那些已删除文档中的所有字段,包括将 uint 字段设置为 0。这适用于正查询,它将不匹配已清除的“已删除”文档中的任何文本。

一种解决方法是在您的文档中添加一个 uint 字段,在下面称为“更新”,用作可能返回已删除 ID 的查询的过滤器,例如否定查询。

(下面的示例使用CloudSearch 的 Boto 接口库,为简洁起见省略了许多步骤。)

添加文档时,将字段设置为当前时间戳

doc['updated'] = now_utc  # unix time in seconds; useful for 'version' also.
doc_service.add(id, now_utc, doc)
conn.commit()

当您删除时,CloudSearch 会将 uint 字段设置为 0:

doc_service.delete(id, now_utc)
conn.commit()
# CloudSearch sets doc's 'updated' field = 0

现在,您可以在否定查询中区分已删除文档和活动文档。下面的示例正在搜索包含 86 个文档的测试索引,其中大约一半被删除。

# negative query that shows both active and deleted IDs
neg_query = "title:'-foobar'"
results = search_service.search(bq=neg_query)
results.hits  # 86 docs in a test index

# deleted items
deleted_query = "updated:0"
results = search_service.search(bq=deleted_query)
results.hits  # 46 of them have been deleted

# negative, filtered query that lists only active
filtered_query = "(and updated:1.. title:'-foobar')"
results = search_service.search(bq=filtered_query)
results.hits  # 40 active docs
于 2014-01-11T02:01:01.803 回答
1

我认为你可以这样做:

search-[mySearchEndPoint].cloudsearch.amazonaws.com/2011-02-01/search?bq=-impossibleTermToSearch

注意术语开头的“-”

于 2013-01-29T13:38:08.020 回答