我的查询如下:
((company_id:1) AND (candidate_tags:"designer"))
但是,这也会匹配candidate_tags
为interaction 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 designer
和talent
,搜索talent
应该是匹配但designer
不应该。
答案 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)
not_analyzed
字段(Andrei Stefan&#39}的解决方案,上面已回答)对于#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"
}
}