我们如何与搜索查询一起使用存在查询?

时间:2017-01-11 10:40:54

标签: elasticsearch elasticsearch-plugin

我在Elasticsearch中有一个场景,我的索引文档是这样的: -

    {"id":1,"name":"xyz", "address": "xyz123"}
    {"id":1,"name":"xyz", "address": "xyz123"}
    {"id":1,"name":"xyz", "address": "xyz123", "note": "imp"}

这里要求强调我们必须做一个术语匹配查询然后提供相关性得分给他们这是一个直接的事情,但这里的另一个方面是如果在搜索结果中找到任何文档有注释字段然后应该给出相关性更高。我们如何通过DSL查询实现它?使用存在,我们可以检查哪些文档包含注释,但是如何在ES查询中与匹配查询集成。已经尝试了很多方法但没有工作。

2 个答案:

答案 0 :(得分:1)

使用ES 5,您可以boost exists querynote字段的文档提供更高的分数。例如,

{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "name": {
                        "query": "your term"
                    }
                }
            },
            "should": { 
                "exists": {
                    "field": "note",
                    "boost": 4
                }
            }
        }
    }
}

使用ES 2,您可以尝试boosted filtered subset

{
    "query": {
        "function_score": {
            "query": {
                "match": { "name": "your term" }
            },
            "functions": [
            {
                "filter": { "exists" : { "field" : "note" }},
                "weight": 4
            }
            ],
            "score_mode": "sum"
        }
    }
}

答案 1 :(得分:0)

我相信您正在寻找提升查询功能 https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query-dsl-boosting-query.html

{
   "query": {
      "boosting": {
         "positive": {
            <put yours original query here>           
         },
         "negative": {
            "filtered": {
               "filter": {
                  "exists": {
                     "field": "note"
                  }
               }
            }
         },
         "negative_boost": 4
      }
   }
}