10

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

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

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

这可能吗?如果是这样,它会怎么做。

4

4 回答 4

5

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

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

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

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

所有文件包含fieldfield:[* TO *]

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

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

field:*-field:*

于 2016-05-11T20:59:56.887 回答
4

我也在别处看了,似乎:

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

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

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

于 2014-10-28T10:59:53.137 回答
2

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

  1. 索引一个名为类似的新字段has_language,将其值设置为language!=null在文档提交时。
  2. 这更像是一种 hack,因为 range 只能与整数一起使用,但我已经成功地在 literal fields 上使用了它(range field=language [0,})
于 2014-10-27T17:31:23.240 回答
1

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

(prefix field=example '')

这将只产生字段不为空的结果example

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

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

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

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

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

(not (prefix field=example ''))
于 2017-09-07T17:03:15.040 回答