Elasticsearch首先返回完全匹配,然后返回其他匹配

时间:2017-01-27 16:20:14

标签: elasticsearch

我有一些PageDocument我希望根据标题进行搜索,不包括PageDocument s,其路径以某些特定文字开头。分析该字段。我想要一些模糊来帮助用户解决拼写错误。我需要能够进行部分匹配,因此some会匹配some textthis is some text

如果我使用以下查询,由于tf-idf

,我没有得到完全匹配作为第一个结果
{
  "size": 20,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": {
              "query": "myterm",
              "fuzziness": 1
            }
          }
        }
      ],
      "must_not": [
        {
          "wildcard": {
            "path": {
              "value": "/test/*"
            }
          }
        }
      ]
    }
  }
}

然后我在not_analyzed添加了title.not_analyzed版本的标题字段,并尝试使用term添加功能分数以增加完全匹配的权重。

{
  "query": {
    "function_score": {
      "functions": [
        {
          "weight": 2,
          "filter": {
            "fquery": {
              "query": {
                "term": {
                  "title.not_analyzed": {
                    "value": "myterm"
                  }
                }
              }
            }
          }
        }
      ],
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "title": {
                  "query": "myterm",
                  "fuzziness": 1
                }
              }
            }
          ],
          "must_not": [
            {
              "wildcard": {
                "path": {
                  "value": "/path/*"
                }
              }
            }
          ]
        }
      },
      "boost_mode": "multiply"
    }
  }
}

但这给了我同样的结果。如何才能获得先返回的完全匹配?

1 个答案:

答案 0 :(得分:4)

我们通过添加shouldboost的组合找到了解决方法。

{
  "size": 20,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": {
              "query": "myterm",
              "fuzziness": 1
            }
          }
        }
      ],
      "must_not": [
        {
          "wildcard": {
            "path": {
              "value": "/path/*"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "title": {
              "value": "myterm",
              "boost": 10
            }
          }
        }
      ]
    }
  }
}