search - 更喜欢在搜索结果的开头而不是在结尾使用 elasticsearch 匹配搜索词

标签 search lucene elasticsearch

我有一个查询,但我无法返回最相关的答案。

如果我搜索“herp”,结果是

  • 福赫普
  • 草草
  • 条状疱疹
  • 疱疹病毒

最好我想要这个顺序

  • 疱疹病毒
  • 草草
  • 条状疱疹
  • 福赫普

所以我想我的问题是:如何让位于一系列单词开头的词项比出现在结尾处的词项得分更高?

我使用的分析器是这样的:

"analyzer":[
  "autocomplete":[
    "type":"custom",
    "tokenizer":"standard",
    "filter":[ 
      "standard",
      "lowercase",
      "stop",
      "edgeNGramAlpha" 
    ]
  ],
  "filter":[
    "edgeNGramAlpha":[
      "type":"edgeNGram",
      "min_gram":1,
      "max_gram":20
    ]
  ]
]

并且映射看起来像这样(战利品田地但阿拉看起来一样)

"name": [
  "type": "multi_field",
  "fields" : [
    "untouched": [
      "type": "string",
      "index": "not_analyzed"
    ],
    "name": [
      "type": "string"
    ],
    "autocomplete": [
      "analyzer":"${language}_autocomplete",
      "type":"string",
    ]
  ]
]

查询看起来像这样:

{
  "from": 0,
  "size": 10,
  "query": {
    "filtered": {
      "query": {
        "multi_match": {
          "query": "herp",
          "fields": [
            "name^8",
            "name.autocomplete^4",
            "historic_name.autocomplete"
          ],
          "type": "cross_fields",
          "operator": "AND",
          "analyzer": "standard"
        }
      }
    }
  }
}

最佳答案

实现此目的的一种方法是在字段开头使用 span first 为术语提供额外的提升。

示例:

{
   "from": 0,
   "size": 10,
   "query": {
      "bool": {
         "disable_coord": true,
         "must": [
            {
               "multi_match": {
                  "query": "herp",
                  "fields": [
                     "name^8",
                     "name.autocomplete^4",
                     "historic_name.autocomplete"
                  ],
                  "analyzer": "standard"
               }
            }
         ],
         "should": [
            {
               "span_first": {
                  "match": {
                     "span_term": {
                        "name": "herp"
                     }
                  },
                  "end": 1,
                  "boost": 1
               }
            },
            {
               "span_first": {
                  "match": {
                     "span_term": {
                        "historic_name": "herp"
                     }
                  },
                  "end": 1,
                  "boost": 1
               }
            }
         ],
         "minimum_number_should_match": 0
      }
   }
}

关于search - 更喜欢在搜索结果的开头而不是在结尾使用 elasticsearch 匹配搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569630/

相关文章:

java - 使用 charAt 在字符串中搜索子字符串

Elasticsearch 不返回多匹配查询的结果

json - Elasticsearch不返回jsonp

search - 超越搜索中的“LIKE”

在注册表中搜索键 - JScript

java - lucene中搜索不包含字段的文档

java - 如何获取文档字段的 TokenStream 以用于突出显示?

elasticsearch - 按术语分组的堆叠 View 不适用于Grafana-Framework和Elasticsearch

php - Elasticsearch 在映射时更改日期格式

mysql - 加入搜索结果