elasticsearch,Filter,elasticsearch" /> elasticsearch,Filter,elasticsearch" />

Filter 我不知道';我无法从elasticsearch查询中获取任何文档。有人能指出我的错误吗?

Filter 我不知道';我无法从elasticsearch查询中获取任何文档。有人能指出我的错误吗?,filter,elasticsearch,Filter,elasticsearch,我以为我已经找到了Elasticsearch,但我怀疑我没能找到什么,因此出现了这个问题: 我正在为产品编制索引,这些产品有大量的字段,但问题是: { "show_in_catalogue": { "type": "boolean", "index": "no" }, "prices": { "type": "object", "dynamic": false, "properties": { "site_id": {

我以为我已经找到了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"
      }
    }
  }
}
我试图返回所有“在目录中显示”为真的文件,并且有一个站点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
              }
            }
          ]
        }
      }
    }
  }
}
您已将站点id设置为{“索引”:“否”}。这会告诉ElasticSearch从索引中排除该字段,从而无法查询或筛选该字段。数据仍将被存储。同样,可以将字段设置为仅在索引中且可搜索,但不存储

我对ElasticSearch也是新手,不能总是问问题!我被你的质疑弄糊涂了。如果您打算“只是过滤”,那么您不需要查询。我不明白的是你在术语过滤器中使用了两个字段。我从来没有这样做过。我猜它就像一个OR?而且,如果没有匹配项,它似乎会返回所有内容。如果您希望查询的结果经过过滤,则需要使用

-d '{
   "query": {
      "filtered": {
         "query": {},
         "filter": {}
      }
   }
}'
如果您只想应用过滤器,那么这个过滤器应该在不需要任何“查询”的情况下工作

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

谢谢-我尝试了你的建议并澄清了我的问题。我只是在玩弄一个空查询,以便在过滤器处理完整的结果集时填充它。仍然无法从中得到任何东西,但我会继续进行黑客攻击。啊哈-如果我将所有我想过滤的内容都编入索引,那么它就起作用了。我没有意识到你需要索引东西来过滤——我以为它只适用于查询搜索!如果我接受这个答案,你会澄清你的编辑来解释这一点,让未来的读者找到它吗?谢谢编辑!对不起,我在用手机重新检查你的问题。因此,关于索引编号的编辑并不突出。