Elastic Search 6.3术语过滤器不适用于整数列

时间:2018-06-29 13:36:28

标签: ruby-on-rails elasticsearch ruby-on-rails-5 filtering elasticsearch-6

我在ROR应用程序中集成了elasticsearch。

我正在使用弹性搜索来找到名为“ xyz”并根据星数= 1进行过滤的产品

这是我的映射:

Vector

我正在使用以下查询:

    {
      :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
          }
        }
      }
    }

这没有给我匹配,但我的产品记录中有星星的值为1。 此外,范围查询不会给出任何带有野外星号的结果。

这是应该与以上查询匹配的记录:

    {

      "query": {

        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "xyz",
                "fields": ["name", "description"],
                "type": "most_fields"
              }
            },
            {
              "match": {
                "available": true
              }
            }
          ],
          "filter": {
            "term": {
              "stars": 1
            }
          }
        }
      }
    }

2 个答案:

答案 0 :(得分:0)

映射和查询看起来不错,也许是数据中的问题(或者代码中的映射与集群中的映射不相同?)。

我还建议您将“ available:true”匹配项作为“条件”过滤器移到过滤器部分吗?过滤器也是数组,就像必须的一样。

答案 1 :(得分:0)

在索引字段时尝试添加doc_value: true

indexes :stars, type: 'integer', doc_values: true

默认情况下,大多数字段都已编入索引,这使它们可搜索。倒排索引允许查询在唯一的术语排序列表中查找搜索词,并从中立即访问包含该词的文档列表。

对脚本中的字段值进行排序,聚合和访问需要不同的数据访问模式。除了查找术语和查找文档以外,我们还需要查找文档并查找其在字段中具有的术语。

Doc值是在文档索引时构建的磁盘上数据结构,这使这种数据访问模式成为可能。它们存储与_source相同的值,但以面向列的方式存储,这对于排序和聚合而言更为有效。几乎所有字段类型都支持Doc值,但值得注意的是分析的字符串字段除外。

尽管默认doc_values是true,但明确添加它可以解决我的目的