如何在弹性搜索中提高单词/短语完全匹配的分数?

时间:2019-06-09 22:00:28

标签: elasticsearch

我有一个包含电影专营权的索引,我希望确切的词/短语匹配得分更高。例如,如果我搜索"Star Trek",我希望"Star Trek"得分最高(第一个结果),然后是"Star Trek Beyond""Star Trek Into Darkness"。目前,当我搜索"Star Trek"时,会得到标题中带有较高得分的其他单词。这可能吗?

如果搜索词周围存在一些其他不匹配的文本,例如:"(randomText) Star Trek (randomText)"

,也可以获得与上述相同的结果。

这是我的设置/映射:

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title_english": {
        "type": "text",
        "fields": {
          "raw": { "type": "keyword" },
          "space": { "type": "text", "analyzer": "whitespace" }
        },
        "analyzer": "autocomplete"
      },
      "title_native": {
        "type": "text",
        "fields": {
          "raw": { "type": "keyword" },
          "space": { "type": "text", "analyzer": "whitespace" }
        },
        "analyzer": "autocomplete"
      },
      "title_romaji": {
        "type": "text",
        "fields": {
          "raw": { "type": "keyword" },
          "space": { "type": "text", "analyzer": "whitespace" }
        },
        "analyzer": "autocomplete"
      },
      "title_synonyms": {
        "type": "text",
        "fields": {
          "raw": { "type": "keyword" },
          "space": { "type": "text", "analyzer": "whitespace" }
        },
        "analyzer": "autocomplete"
      }
    }
  }
}

这是我的查询:

'query': {
    'bool': {
        'must': {
            'multi_match': {
                'query': request.args.get('query'),
                'analyzer': 'standard',
                'fields': ['title_*']
            },
        },
        'should': [{
            'term': {
                'title_*.raw': {
                    'value': request.args.get('query'),
                    'boost': 3
                }
            }
        },
        {
            'prefix': {
                'title_*.raw': {
                    'value': request.args.get('query'),
                    'boost': 2
                }
            }
        }]
    }
}

0 个答案:

没有答案