如何使弹性搜索仅匹配全场

时间:2015-11-17 13:15:35

标签: search elasticsearch

我的查询如下:

((company_id:1) AND (candidate_tags:"designer"))

但是,这也会匹配candidate_tagsinteraction designer的用户。 如何排除这些?

这是我的完整搜索主体:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query":
                        "((company_id:1) AND (candidate_tags:\"designer\"))"
                }
            }
        }
    }
    "sort":{
        "candidate_rating":{
            "order":"desc"
        },
        "candidate_tags",
        "_score"
    }
}

额外信息

现在已经意识到答案了:candidate_tags是一个字符串数组,比如候选人有标记interaction designertalent,搜索talent应该是匹配但designer不应该。

3 个答案:

答案 0 :(得分:2)

candidate_tags字段设为not_analyzed或使用keyword分析器进行分析。

{
  "mappings": {
    "test": {
      "properties": {
        "candidate_tags": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

或在您现有的地图上添加raw字段,如下所示:

{
  "mappings": {
    "test": {
      "properties": {
        "candidate_tags": {
          "type": "string",
          "fields": {
            "raw": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

对于第一个选项,请使用与您现在使用的查询相同的查询。 对于第二个选项,使用candidate_tags.raw,如下所示:

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "((company_id:1) AND (candidate_tags.raw:\"designer\"))"
        }
      }
    }
  }
...

答案 1 :(得分:0)

另一种方法是使用脚本:

POST test/t/1
{
"q":"a b"
}
POST test/t/2
{
  "q":"a c"
}
POST test/t/_search
{
"query": {
    "filtered": {
    "filter": {
        "script": {
        "script": "return _source.q=='a b'"

     }
     }
  }
 }  
}

答案 2 :(得分:0)

  1. 通过过滤。
  2. 将字段candidate_tags设为精确值字段 - 又称not_analyzed字段(Andrei Stefan&#39}的解决方案,上面已回答)
  3. 对于#2,请注意以后不要将not_analyzed字段与那些字段混合。更多:https://www.elastic.co/guide/en/elasticsearch/guide/current/_exact_value_fields.html

    使用#1,您的查询看起来就像那样(从内存中写下来,不要让ES对我这样,所以无法验证):

    {
        "query": {
            "filtered": {
                "query": {
                    "query_string": {
                        "query":
                            "((company_id:1) AND (candidate_tags:\"designer\"))"
                    }
                },
                "filter" : {
                    "term" : { 
                        "candidate_tags" : "designer"
                    }
                }
            }
        }
        "sort":{
            "candidate_rating":{
                "order":"desc"
            },
            "candidate_tags",
            "_score"
        }
    }