elasticsearch elasticsearch edge n-gram标记器:在标记中包含符号
我正在使用基于Edge NGram标记器的自定义标记器,我希望能够搜索诸如“sport+”之类的字符串,即我希望特殊符号,例如+符号被视为标记的一部分 例如,我们有以下字段的文档:elasticsearch elasticsearch edge n-gram标记器:在标记中包含符号,elasticsearch,nest,elasticsearch,Nest,我正在使用基于Edge NGram标记器的自定义标记器,我希望能够搜索诸如“sport+”之类的字符串,即我希望特殊符号,例如+符号被视为标记的一部分 例如,我们有以下字段的文档: “typeName”:“LC 500h Sport+CVT” 或 “类型名称”:“LC 500h运动CVT” 使用以下子句执行查询: { "match": { "typeName": { "query": "sport+ cvt", "operator": "and"
“typeName”:“LC 500h Sport+CVT”
或
“类型名称”:“LC 500h运动CVT”
使用以下子句执行查询:
{
"match": {
"typeName": {
"query": "sport+ cvt",
"operator": "and"
}
}
}
获取两个文档。但是,在这种情况下,我们只希望返回带有“typeName”:“LC 500h Sport+CVT”
的文档
我们在标记器设置中使用了以下标记字符类:数字
,字母
,标点
。我认为添加symbol
作为token\u chars类并重新创建索引会起到作用,但没有起到任何作用
编辑:
以下是嵌套语法中的分析器定义:
设置(s=>s)
.Analysis(=>
_.分析仪(a=>a
.习俗(
“车辆分析器”,
描述符=>描述符
.Tokenizer(车载数据记录器)
.Filters(“小写”))
.标准(“车辆研究”,
描述符=>描述符)
.Tokenizer(描述符=>描述符
埃金格拉姆先生(
汽车发动机,
tokenizerDescriptor=>
标记描述符
明格拉姆先生(1)
.MaxGram(10)
.代币(
TokenChar.Digit,
一封信,
符号,标点符号,
TokenChar.Symbol(()()))
如标记字符中所述:
应包含在标记中的字符类。弹性搜索
将在不属于指定类的字符上拆分。
默认为[](保留所有字符)
默认情况下,elasticsearch保留所有字符。仅当您希望反转索引中的字符类更少时,才应使用此选项。因此,要解决您的问题,您只需删除token_chars的定义:您的标记器将保留所有字符您可以共享您的analyzer定义吗?@Lupanoide我以嵌套语法添加了analyzer定义,因为这是我们实际创建它的方式。谢谢不过,这是否考虑了空格
whitespace
也是一个有效的token\u chars类,但我们不希望在token中包含空格字符。我尝试在不指定token\u chars
的情况下重新创建索引。分析器确实正确处理空白。但是,原来的问题仍然存在:对sport+cvt
的查询会同时找到sport+cvt
和sport-cvt
@Developer-Ok。进行匹配查询时,查询也会标记化,以便将vehicleTokenization应用于sport+并查找sport。也许您应该尝试匹配短语查询幸运的是,匹配短语
也有同样的问题:(另外,match\u phrase
似乎不符合其他一些要求,例如,它不会为lc cvt
之类的查询生成结果,因为lc
和cvt
两个词在搜索的文档中并不相邻。您是对的,在这种情况下,您应该在查询时强制使用另一个分析器-例如le标准。它将在空格上标记。然后您应该实现搜索\ u分析器。请阅读此处解释EdgeGram和搜索\ u分析器的部分