Amazon Cloudsearch:过滤是不是存在

Posted

技术标签:

【中文标题】Amazon Cloudsearch:过滤是不是存在【英文标题】:Amazon Cloudsearch : Filter if existsAmazon Cloudsearch:过滤是否存在 【发布时间】:2014-12-22 21:07:30 【问题描述】:

我有一个亚马逊云搜索域。目的是过滤字段“语言”是否存在。 并非所有对象都有语言,我希望过滤那些确实有语言的对象,但也返回没有任何语言的对象。

我想过滤 (或语言:'en'语言:null)

但是 null 不能在字符串中传递。

这可能吗?如果是的话怎么做。

【问题讨论】:

【参考方案1】:

如果您愿意使用 Lucene 查询解析器,您可以这样表达您的查询:

(*:* OR -language:*) OR language:en

注意:由于 Lucene 处理否定 OR 子句的方式,时髦的 (*:* OR ...) 构造是必要的。

通常,您可以使用 Lucene 查询解析器按字段的存在/不存在进行过滤:

所有包含field的文档:field:[* TO *]

所有不包含field:-field:[* TO *]的文档

注意:如果field 是文本(文本或文字数据类型),则不需要范围查询,您可以将上述内容缩短为:

field:*-field:*

【讨论】:

这应该是这个问题的公认答案。【参考方案2】:

我也在别处看了,好像:

最简单的方法是为该字段设置一个默认值,然后将该值用于您的 null。

例如,将默认值设置为字符串“null”,然后您可以轻松地对其进行测试。

我相信您可以添加默认值并重新索引,这应该会重新应用默认值。

【讨论】:

我强烈建议不要这样做。像这样使用魔法值总是一个坏主意。这不应该是公认的答案。检测空值的正确答案是使用(not (prefix language='')) 如果您在下面没有看到他的答案,请纠正@justin.m.chase 评论,应该是(not (prefix field='language' ''))【参考方案3】:

没有办法干净利落地做你想做的事,但这里有两个选择:

    索引一个名为has_language 之类的新字段,在文档提交时将其值设置为language!=null。 这更像是一种 hack,因为 range 只能与整数一起使用,但我已经成功地将它用于文字字段 (range field=language [0,)

【讨论】:

【参考方案4】:

您可以根据您的字段类型使用prefixrange 运算符搜索存在。如果类型是术语或字符串,则可以使用如下前缀:

(prefix field=example '')

这将只产生字段example 的非空结果。

对于日期,您可以使用包含日期范围:

(range field=updated ['0000-01-01T00:00:00.000Z',)

这将只包括在给定时间之后具有updated 日期的项目,不包括具有空更新日期的项目。您可以对其他字段类型进行其他类似的搜索。

同样,您可以使用not 运算符来获取具有空字段的项目集。

例如,所有带有空 example 字段的项目:

(not (prefix field=example ''))

【讨论】:

以上是关于Amazon Cloudsearch:过滤是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift 框架(Oracle 数据仓库迁移)

亚马逊云搜索查询

个人觉得存成char(12),优于varchar(12)

八分钟就看懂 | 推荐系统 (协同过滤) 原来这么简单

Amazon Redshift - 在 where 条件下的变量

#神器#布隆过滤器:怎么在几十亿数据的中判断一个字符串是否存?