在elasticsearch中组合过滤器和查询

时间:2017-01-09 01:19:04

标签: elasticsearch

我尝试使用elasticsearch 5.1.1进行搜索,以寻找单词" construction"任何地方,并使用阶段1或阶段2过滤结果"阶段"领域。 我尝试过许多都失败的事情。 这是明智的一个:

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" } }
      ]
    }
  }
}'

没有结果。

2 个答案:

答案 0 :(得分: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”,它也应该工作,因为如果你在相位字段上使用默认令牌器,它将被标记化为[phase1,phase2],但如果你将提供“阶段1 /阶段2”那么它将从那以后它将被标记为[阶段,1,2]

更新后。 问题是你写了phase1,phase2但实际上你有阶段2,这意味着ES会将阶段2标记为[阶段2],你试图搜索“阶段2”,这意味着没有匹配。您可以选择创建阶段字段as keyword,然后您可以搜索“阶段1”,“阶段2”但是如果您有“阶段1 /阶段2”,那么ES将期望您搜索完全相相同,但您可以将该字段拆分为数组,当您编制索引时,您将发送[“阶段1”,“阶段2”]

答案 1 :(得分:-2)

过滤器需要在bool范围之外:

    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" ]
         }
     }
 }'