弹性搜索:查询复杂场景

时间:2014-06-11 13:43:37

标签: elasticsearch

我们正在研究求职门户网站,其中数据对象采用以下格式(样本)在elasticsearch中被提取:

{
  "Title": "web developer",
  "Company": "ABC Corp",
  "Pay": 100000,
  "keywords": "web search wcf",
  "Country": "USA"
}

此处用户提供搜索字词和国家/地区,我们希望根据以下条件进行显示:

  1. 所有与Titlekeywords中的搜索字匹配的作业,并匹配Country字段中的国家/地区。结果应该在顶部具有完全的单词匹配,在底部具有部分单词匹配。所有完整匹配应按Pay排序。
  2. 我们希望向用户显示20个结果,如果给定国家/地区的结果少于20个,那么我们希望按匹配类型(完整/部分)显示其他国家/地区的结果,然后按Pay显示。< / LI>

    我们已尝试过多种方法在一个查询中查询这些数据,但似乎没有任何效果。我们不是试图在两个查询中获得这些结果(一个查询用于国家过滤器,一个用于没有国家过滤器),并将两者的结果组合在一起。

    任何人都可以帮助我们构建此查询。

    修改
    我觉得我还不够清楚。给定的Json是ES中一条记录的示例。现在,如果用户输入搜索&#34; wcf&#34;并选择country&#34; USA&#34;然后我们需要按以下顺序显示结果: 1.所有与关键字&#34; wcf&#34;匹配的结果按照以下顺序   一个。所有结果与国家美国按工资分类。   湾匹配关键字但来自其他国家/地区并按付费排序的结果。

    下面是我们正在使用的查询:

    GET resume/_search
    {
      "query": {
        "function_score": {
          "query": {
            "bool": {
              "must": [
                {
                  "bool": 
                  {
                    "must": [
                      {
                        "multi_match": {
                          "query": "wcf",
                          "fields": ["title", "keywords"]
                        }
                      }
                    ]
                    , "should": [
                      {
                        "match_phrase_prefix": {
                          "title": "wcf"
                        }
                      }
                    ]
                    , "should": [
                      {
                        "match_phrase_prefix": {
                          "keywords": "wcf"
                        }
                      }
                    ]
                  }
                }
              ] 
            }
          },
          "functions": [
            {
              "script_score": {
                "script": "_score * (doc['Country'].value == 'USA' ? 100000*doc['pay'].value : 1*doc['pay'].value)"
              }
            }
          ]
        }
      }
    }
    

    这适用于我们的场景。如果您能提出更好的选择,请告诉我。

1 个答案:

答案 0 :(得分:0)

对于您的第一个要求,查询dsl位于

之下

All the jobs which match search word in title or keyword, and match country in country field. Results should have complete word match on top and partial word match on bottom. All complete match should be sorted by pay

{
   "query": {
      "filtered": {
         "query": {
            "query_string": {
               "default_field": "Title",
               "query": "Title:web developer or keywords:web search wcf"
            }
         },
         "filter": {
            "bool": {
               "must": [
                  {
                     "term": {
                        "Country": "USA"
                     }
                  },
                  {
                     "term": {
                        "Company": "ABC"
                     }
                  },
                  {
                     "term": {
                        "Pay": "100000"
                     }
                  }
               ]
            }
         }
      }
   },
  "sort": [
      {
         "Pay": {
            "order": "desc"
         }
      }
  ]
}