弹性搜索 6.3 术语过滤器不适用于整数列
Elastic search 6.3 term filter not working on integer columns
我已经在 ROR 应用程序中集成了 elasticsearch。
我正在使用弹性搜索查找名为 'xyz' 的产品,并根据星数 = 1
进行过滤
这是我的映射:
{
:product => {
:dynamic => false,
:properties => {
:name => {
:analyzer => "english",
:type => "text"
},
:description => {
:analyzer => "english",
:type => "text"
},
:available => {
:type => :boolean
},
:last_updated => {
:type => :date
},
:categories_names => {
:type => "text"
},
:stars => {
:type => :integer
}
}
}
}
我正在使用以下查询:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "xyz",
"fields": ["name", "description"],
"type": "most_fields"
}
},
{
"match": {
"available": true
}
}
],
"filter": {
"term": {
"stars": 1
}
}
}
}
}
这没有给我匹配项,但我有星号为 1 的产品记录。
此外,范围查询未给出任何带星标的结果。
这是应该与上述查询相匹配的记录:
#<Product> {
"id" => 90,
"name" => "xyz",
"last_updated" => Tue, 22 May 2018 15:04:43 UTC +00:00,
"stars" => 1,
"description" => "training",
"available" => true,
"created_at" => Thu, 21 Jun 2018 11:56:15 UTC +00:00,
"updated_at" => Fri, 29 Jun 2018 10:30:06 UTC +00:00,
}
映射和查询看起来不错,可能是数据中的问题(或者您的代码中的映射与集群中的映射不一样?)。
我还可以建议您将 "available: true" 匹配作为 "term" 过滤器移动到过滤器部分吗?过滤器也是一个数组,必须的。
尝试在索引字段时添加 doc_value: true
indexes :stars, type: 'integer', doc_values: true
默认情况下,大多数字段都已编入索引,这使得它们可搜索。倒排索引允许查询在唯一排序的术语列表中查找搜索术语,并从中立即访问包含该术语的文档列表。
排序、聚合和访问脚本中的字段值需要不同的数据访问模式。我们需要能够查找文档并找到它在字段中的术语,而不是查找术语和查找文档。
文档值是磁盘上的数据结构,在文档索引时构建,这使得这种数据访问模式成为可能。它们存储与 _source 相同的值,但以面向列的方式存储,这对于排序和聚合来说更加有效。几乎所有字段类型都支持 Doc 值,分析字符串字段除外。
虽然默认 doc_values 是 true
但明确添加它解决了我的目的
我已经在 ROR 应用程序中集成了 elasticsearch。
我正在使用弹性搜索查找名为 'xyz' 的产品,并根据星数 = 1
进行过滤这是我的映射:
{
:product => {
:dynamic => false,
:properties => {
:name => {
:analyzer => "english",
:type => "text"
},
:description => {
:analyzer => "english",
:type => "text"
},
:available => {
:type => :boolean
},
:last_updated => {
:type => :date
},
:categories_names => {
:type => "text"
},
:stars => {
:type => :integer
}
}
}
}
我正在使用以下查询:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "xyz",
"fields": ["name", "description"],
"type": "most_fields"
}
},
{
"match": {
"available": true
}
}
],
"filter": {
"term": {
"stars": 1
}
}
}
}
}
这没有给我匹配项,但我有星号为 1 的产品记录。 此外,范围查询未给出任何带星标的结果。
这是应该与上述查询相匹配的记录:
#<Product> {
"id" => 90,
"name" => "xyz",
"last_updated" => Tue, 22 May 2018 15:04:43 UTC +00:00,
"stars" => 1,
"description" => "training",
"available" => true,
"created_at" => Thu, 21 Jun 2018 11:56:15 UTC +00:00,
"updated_at" => Fri, 29 Jun 2018 10:30:06 UTC +00:00,
}
映射和查询看起来不错,可能是数据中的问题(或者您的代码中的映射与集群中的映射不一样?)。
我还可以建议您将 "available: true" 匹配作为 "term" 过滤器移动到过滤器部分吗?过滤器也是一个数组,必须的。
尝试在索引字段时添加 doc_value: true
indexes :stars, type: 'integer', doc_values: true
默认情况下,大多数字段都已编入索引,这使得它们可搜索。倒排索引允许查询在唯一排序的术语列表中查找搜索术语,并从中立即访问包含该术语的文档列表。
排序、聚合和访问脚本中的字段值需要不同的数据访问模式。我们需要能够查找文档并找到它在字段中的术语,而不是查找术语和查找文档。
文档值是磁盘上的数据结构,在文档索引时构建,这使得这种数据访问模式成为可能。它们存储与 _source 相同的值,但以面向列的方式存储,这对于排序和聚合来说更加有效。几乎所有字段类型都支持 Doc 值,分析字符串字段除外。
虽然默认 doc_values 是 true
但明确添加它解决了我的目的