我正在使用基于Edge NGram token 生成器的自定义 token 生成器,并且我希望能够搜索诸如“sport +”之类的字符串,即,我希望将特殊符号(例如+号)视为 token 的一部分。
例如,我们的文档包含以下字段:"typeName": "LC 500h Sport+ CVT"
要么"typeName": "LC 500h Sport CVT"
。
使用以下子句执行查询:
{
"match": {
"typeName": {
"query": "sport+ cvt",
"operator": "and"
}
}
}
提取两个文档。但是,在这种情况下,我们只希望返回带有
"typeName": "LC 500h Sport+ CVT"
的文档。我们一直在标记程序设置中使用以下token_chars类:
digit
,letter
,punctuation
。我以为将symbol
添加为token_chars类并重新创建索引可以解决问题,但这没有帮助。编辑:
这是Nest语法中的分析器定义:
Settings(s => s
.Analysis(_ =>
_.Analyzers(a => a
.Custom(
"vehicleanalyzer",
descriptor => descriptor
.Tokenizer(vehicleEdgeNgram)
.Filters("lowercase"))
.Standard("vehiclesearch",
descriptor => descriptor))
.Tokenizers(descriptor => descriptor
.EdgeNGram(
vehicleEdgeNgram,
tokenizerDescriptor =>
tokenizerDescriptor
.MinGram(1)
.MaxGram(10)
.TokenChars(
TokenChar.Digit,
TokenChar.Letter,
TokenChar.Punctuation,
TokenChar.Symbol)))))
最佳答案
如documentation所写,token_chars为:
Character classes that should be included in a token. Elasticsearch will split on characters that don’t belong to the classes specified. Defaults to [] (keep all characters).
默认情况下,elasticsearch保留所有字符。仅当您希望倒排索引中的字符类别更少时,才应使用此选项。因此,要解决您的问题,您只需删除token_chars的定义:您的 token 生成器将保留所有字符
关于elasticsearch - elasticsearch edge n-gram token 生成器:在 token 中包含符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59578056/