【发布时间】:2018-05-15 14:36:31
【问题描述】:
我正在构建一个企业社交网络。
我想建议人们根据他们的头衔添加为朋友。 例如,值可以是:开发者、博主、歌手、理发师、调酒师……
我的用户被保存到 ElasticSearch 中,他们的标题保存在“标题”字段中。
当前映射为:
title: {
type: 'text',
analyzer: 'autocomplete_analyzer',
search_analyzer: 'autocomplete_analyzer_search'
}
查询是:
should: [
{
match: {
title: {
query: user.title,
minimum_should_match: '90%',
boost: 2
}
}
}
]
分析器的定义是:
indexConfig: {
settings: {
analysis: {
analyzer: {
autocomplete_analyzer: {
tokenizer: 'autocomplete_tokenizer',
filter: ['lowercase', 'asciifolding']
},
autocomplete_analyzer_search: {
tokenizer: 'lowercase',
filter: ['asciifolding']
},
phrase_analyzer: {
tokenizer: 'standard',
filter: ['lowercase', 'asciifolding', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
},
derivative_analyzer: {
tokenizer: 'standard',
filter: ['lowercase', 'asciifolding', 'derivative_filter', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
}
},
tokenizer: {
autocomplete_tokenizer: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 20,
token_chars: ['letter', 'digit']
}
},
filter: {
derivative_filter: {
type: 'word_delimiter',
generate_word_parts: true,
catenate_words: true,
catenate_numbers: true,
catenate_all: true,
split_on_case_change: true,
preserve_original: true,
split_on_numerics: true,
stem_english_possessive: true
},
en_stop: {
type: 'stop',
stopwords: '_english_'
},
en_stemmer: {
type: 'stemmer',
language: 'light_english'
},
fr_stop: {
type: 'stop',
stopwords: '_french_'
},
fr_stemmer: {
type: 'stemmer',
language: 'light_french'
}
}
}
}
}
我测试了,相关性很好,但是他们没有足够的用户匹配这个,因为'90%'标准。
一个快速而肮脏的解决方案当然是将这个标准降低到 50%。
但是,如果我这样做,我认为 Elastic 将根据标题中字母的一致性来搜索标题,而不是标题之间接近度的相关性。
例如,如果我的用户是“barber”,ElasticSearch 可能会建议“bartender”,因为他们有共同点:b,a,r ,e,r
因此,我有两个问题:
1 - 我的假设正确吗?
2 - 我可以做些什么来增加我的标题搜索的相关性?
【问题讨论】:
-
为什么要使用自动完成分析器?
-
我不知道,是另一个人创建了初始映射
-
您能否展示一下这个 autocomplete_analyzer 定义的外观,以确保它符合我的预期
-
好的,我编辑帖子
标签: elasticsearch