【发布时间】:2015-09-03 15:01:47
【问题描述】:
我正在使用 Elasticsearch 进行全文搜索,并且正在尝试找到一种更好的方法来搜索长短语。
例如,我有一个字段“Seller”,最多可以包含 250 个字符,我想查找所有带有 Seller = 'some Seller name with spaces' 的项目。
如果我理解正确,为了搜索包含空格的文本,我必须使用 NGramTokenizer,它基本上会创建如下标记:
's', 'so', 'som', 'some', 'some ', 'some s' etc.
我知道我可以定义 min 和 max gram,但我需要能够搜索“a b”,所以我的 min gram 必须至少为 3,max gram 作为我的字段最大长度。
所以我必须为每件商品创建很多代币,而且它只是卖家,但是 4k 字符的描述呢?
此解决方案的性能非常低。
谁能提出一个更好的解决方案来处理带有空格的长短语?
我的索引设置:
analysis: {
analyzer: {
autoComplete: {
filter: [
"lowercase"
],
type: "custom",
tokenizer: "autoComplete"
},
caseInsensitive: {
type: "custom",
filter: [
"lowercase"
],
tokenizer: "keyword"
}
},
tokenizer: {
autoComplete: {
type: "nGram",
min_gram: "1",
max_gram: "40"
}
}
},
我使用“autoComplete”作为索引分析器和“不区分大小写”作为搜索分析器
编辑:
我使用 NGramTokenizer 以便能够搜索部分单词
真实单词示例:
Title: 'Huge 48" Bowtie LED Opti neon wall sign. 100,000 hours Bar lamp light'
search query: 'Huge 48" Bowt'
使用空格标记器,如果您搜索短语,则无法搜索部分单词。
【问题讨论】:
-
不太明白为什么需要 ngram。如果您希望能够搜索
"a b",则需要在索引中包含一个完整的标记a b或两个标记a和b。这可以使用whitespace标记器来完成,这将为文本a b c生成标记:a、b、c。这里不需要 ngram。虽然我可以看到您正在尝试使用自动完成功能做某事,但也许我没有清楚地理解您的问题。 -
嗨 slawek,我已经更新了我的帖子,希望现在 NGramTokenizer 更有意义。
-
我建议您使用 shingles 进行短语匹配,使用 nGrams 搜索单词的一部分。
-
我使用 nGrams 搜索单词的一部分,但是在很长的字段上使用 nGrams 进行索引时存在问题。尝试使用 maxGram = 200+ 进行索引,这将需要很长时间 :(
标签: elasticsearch full-text-search nest