我正在尝试使用elasticsearch 5.1.1进行搜索,以在任何地方查找“construction”一词,并在“phase”字段中使用phase1或phase2过滤结果。
我尝试了很多都失败的事情。
这是一个明智的选择:

curl -XPOST "http://localhost:9200/books/_search?pretty=true" -d '{
  "query": {
    "filtered": {"filter": {"terms": {"phase": ["phase1", "phase2"]}}, "query": "construction"}
  }
}'

错误:
parsing_exception
no [query] registered for [filtered]

另请注意,相位字段的值可能类似于“Phase1 / Phase2”,因此我需要查看它是否包含Phase1或Phase2。
如何执行这样的搜索?

更新

@volodymyr,以下工作:
curl -XPOST "http://localhost:9200/books/_search?pretty=true" -d '{
   "query":{
      "bool":{
         "must":{
               "multi_match":{
                  "query":"construction",
                  "fields":["title"]
               }
         }
      }
   }
}'

结果像
  {
    "_index" : "books",
    "_type" : "gov",
    "_id" : "2296112",
    "_score" : 5.742423,
    "_source" : {
      "description" : "",
      "countries" : [
        "United States"
      ],
      "phase" : "Phase 2",
      "completion_date" : "2018-01-01",
      "references" : [ ],
      "keywords" : [ ],
      "id" : "2296112",
      "title" : "Mainland construction"
  }

然后我尝试添加该阶段,它没有失败,但是没有返回任何结果,因此仍然没有好处:
curl -XPOST "http://localhost:9200/books/_search?pretty=true" -d '{
   "query":{
      "bool":{
         "must":{
               "multi_match":{
                  "query":"construction",
                  "fields":["title"]
               }
         },
         "filter":{
            "terms":{
               "phase":["phase1","phase2"]
            }
         }
      }
   }
}'

还尝试了:
curl -XPOST "http://localhost:9200/books/_search?pretty=true" -d '
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "title" : "construction" }
      },
      "should" : [
        { "term" : { "phase" : "Phase 1" } },
        { "term" : { "phase" : "Phase 2" } }
      ]
    }
  }
}'

它不返回任何结果。

最佳答案

我的错我想念您正在使用5.1,现在该版本的filtered query已删除,您应该使用bool代替

如果您想搜索构造,请使用multi_match例如

curl -XPOST "http://localhost:9200/books/_search?pretty=true" -d '{
   "query":{
      "bool":{
         "must":{
               "multi_match":{
                  "query":"construction",
                  "fields":[
                     "field1",
                     "OTHER_FIELD_IF_YOU_NEED"
                  ]
               }
         },
         "filter":{
            "terms":{
               "phase":[
                  "phase1",
                  "phase2"
               ]
            }
         }
      }
   }
}'

对于值“Phase1 / Phase2”,它也应该起作用,因为如果您在相位字段上使用默认 token 解析器,则它将被标记为[phase1,phase2],但是如果您将提供“Phase 1 / Phase 2”,则此后将不再有效它将被标记为[phase,1,2]

更新后。
问题是您编写了阶段1,阶段2,但实际上您拥有阶段2,这意味着ES会将阶段2标记为[阶段2],并且您尝试搜索“阶段2”,这意味着没有匹配项。您可以选择将相位字段设为as keyword,然后可以搜索“Phase 1”,“Phase 2”,但是如果您拥有“Phase 1 / Phase 2”,则ES会希望您搜索完全相同的词,但是可以将该字段拆分为一个数组,当您建立索引时,您将发送[“Phase 1”,“Phase 2”]

关于elasticsearch - 在Elasticsearch中组合过滤器和查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41539713/

10-12 17:20