弹性ngram优先考虑整个单词

时间:2020-03-27 14:27:24

标签: elasticsearch

我正在尝试构建具有数百万个可能值的自动填充。我设法用两种不同的方法match和ngram做到了。问题是匹配要求用户键入整个单词,而ngram返回的结果很差。如果没有匹配结果,是否有办法只返回n​​gram结果?

方法1:匹配

返回非常相关的结果,但要求用户键入完整的单词

//mapping
analyzer: {
   std_english: {
   type: 'standard',
   stopwords: '_english_',
   },
} 

//search
query: {
   bool: {
   must: [
       { term: { semanticTag: type } }, 
       { match: { search } }
    ]}
}

方法2:ngram

返回差的比赛

//mapping
analysis: {
  filter: { 
     autocomplete_filter: {
        type: 'edge_ngram',
        min_gram: 1,
        max_gram: 20,
     },
},
analyzer: {
  autocomplete: {
    type: 'custom',
    tokenizer: 'standard',
    filter: ['lowercase', 'autocomplete_filter'],
    },
},


//search
query: {
   bool: {
   must: [
       { term: { semanticTag: type } }, 
       { match: {
          term: { 
             query: search,
             operator: 'and',
             }
          }
        }
    ]}
}

1 个答案:

答案 0 :(得分:0)

尝试将查询更改为类似的内容-

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "semanticTag": "type"
          }
        },
        {
          "match_phrase_prefix": {
            "fieldName": {
              "query": "valueToSearch"
            }
          }
        }
      ]
    }
  }
}

您可以使用match_phrase_prefix,通过使用该用户将不需要键入整个单词,用户键入的所有内容以及以索引字段数据开头的内容都将返回。

请注意,这还将从索引文档中的任何可用中间词中提取结果。
例如如果在一个字段中索引的数据类似于-"lorem ipsum"并且用户类型为"ips",那么您将获得整个文档以及以"ips"开头的其他文档

您可以使用标准分析仪或定制分析仪,必须检查哪种分析仪更适合您的用例。根据有问题的信息,以上给出的方法适用于standard analyzer