最有效的解决方案涉及利用ngram标记器来标记
name字段的某些部分。例如,如果您有一个名称,如
petertomson,则ngram令牌生成器将对它进行令牌化和索引,如下所示:
- pe
pet
pete
peter
peter t
peter to
peter tom
peter toms
peter tomso
eter tomson
ter tomson
er tomson
r tomson
tomson
tomson
omson
mson
son
on
因此,将其编入索引后,搜索这些标记中的任何一个都会
peter thomson在其中检索您的文档。
让我们创建索引:
PUT likequery{ "settings": { "analysis": { "analyzer": { "my_ngram_analyzer": { "tokenizer": "my_ngram_tokenizer" } }, "tokenizer": { "my_ngram_tokenizer": { "type": "nGram", "min_gram": "2", "max_gram": "15" } } } }, "mappings": { "typename": { "properties": { "name": { "type": "string", "fields": { "search": { "type": "string", "analyzer": "my_ngram_analyzer" } } }, "type": { "type": "string", "index": "not_analyzed" } } } }}
然后,您将可以通过一个简单且非常有效的
term查询进行如下搜索:
POST likequery/_search{ "query": { "bool": { "should": [ { "term": { "name.search": "peter tom" } } ], "must_not": [ { "match": { "type": "xyz" } }, { "match": { "type": "abc" } } ] } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)