我没有从弹性搜索查询中获取任何文档。有人可以指出我的错误吗?

时间:2013-10-10 17:03:21

标签: filter elasticsearch

我以为我已经找到了Elasticsearch,但我怀疑我没有找到一些东西,因此这个问题:

我正在为具有大量字段的产品编制索引,但有问题的产品是:

{
  "show_in_catalogue": {
    "type": "boolean",
    "index": "no"
  },
  "prices": {
    "type": "object",
    "dynamic": false,
    "properties": {
      "site_id": {
        "type": "integer",
        "index": "no"
      },
      "currency": {
        "type": "string",
        "index": "not_analyzed"
      },
      "value": {
        "type": "float"
      },
      "gross_tax": {
        "type": "integer",
        "index": "no"
      }
    }
  }
}

我正在尝试返回“show_in_catalogue”为真的所有文档,并且site_id为1的价格:

{
  "filter": {
    "term": {
      "prices.site_id": "1",
      "show_in_catalogue": true
    }
  },
  "query": {
    "match_all": {}
  }
}

这会返回零结果。我还尝试了一个带有两个单独术语的“和”过滤器 - 没有运气。

如果我没有过滤器,则返回其中一个文档的子集:

{
  "prices": [
    {
      "site_id": 1,
      "currency": "GBP",
      "value": 595,
      "gross_tax": 1
    },
    {
      "site_id": 2,
      "currency": "USD",
      "value": 745,
      "gross_tax": 0
    }
  ]
}

我希望我可以在这里省略这么多文件;我不相信它是偶然的,但我当然不能肯定。

我是否错过了一项至关重要的知识,或者我做过一些最终的事情?无论哪种方式,我都会感谢专家在这一点上的知识。谢谢!

修改

根据J.T.的建议我还尝试重新索引文档,以便prices.site_id被编入索引 - 没有变化。还试过下面的bool / must过滤器无济于事。

为了澄清,我使用空查询的原因是Web界面可能提供查询字符串,但使用相同的代码来简单地过滤所有产品。因此我离开了查询,但是空了,因为这就是Elastica似乎没有查询字符串的情况。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "show_in_catalogue": true
              }
            },
            {
              "term": {
                "prices.site_id": 1
              }
            }
          ]
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

您将site_id设置为{“index”:“no”}。这告诉ElasticSearch从索引中排除该字段,这使得无法在该字段上查询或过滤。数据仍将存储。同样,您可以将字段设置为仅在索引中并可搜索,但不能存储。

我也是ElasticSearch的新手,并不能总是提出问题!我真的很困惑你的查询。如果您要“只过滤”,那么您不需要查询。我不明白的是你在术语过滤器中使用了两个字段。我从来没有这样做过。我猜它是一个OR吗?此外,如果没有匹配,它似乎返回一切。如果您希望查询过滤该查询的结果,那么您可能希望使用

-d '{
   "query": {
      "filtered": {
         "query": {},
         "filter": {}
      }
   }
}'

如果您只想应用过滤器,那么过滤器应该可以在没有任何“查询”的情况下工作

-d '{
   "filter": {
      "bool": {
         "must": [
            {
               "term": {
                  "show_in_catalogue": true
               }
            },
            {
               "term": {
                  "prices.site_id": 1
               }
            }
         ]
      }
   }
}'