我正在构建我的搜索,但需要使用不同的分析器分析1个字段。我的问题是我需要在其上设置一个分析器用于阻塞(雪球),然后还有一个将完整的单词保留为一个标记(关键字)。我可以通过以下索引设置来实现此功能:
curl -X PUT "http://localhost:9200/$IndexName/" -d '{
"settings":{
"analysis":{
"analyzer":{
"analyzer1":{
"type":"custom",
"tokenizer":"keyword",
"filter":[ "standard", "lowercase", "stop", "snowball", "my_synonyms" ]
}
}
},
"filter": {
"my_synonyms": {
"type": "synonym",
"synonyms_path ": "synonyms.txt"
}
}
}
},
"mappings": {
"product": {
"properties": {
"title": {
"type": "string",
"search_analyzer" : "analyzer1",
"index_analyzer" : "analyzer1"
}
}
}
}
}';
搜索标题字段中的单个单词时出现问题。如果它是用帽子中的猫填充它将它存储为“帽子里的猫”,但如果我搜索猫我没有得到任何回报。
这甚至可以实现,还是我需要有2个单独的字段,用关键字分析一个,用雪球分析另一个?
如果重要的话,我在vb代码中使用nest来索引数据。
由于 罗伯特
答案 0 :(得分:3)
您可以使用fields
属性(以前称为multi fields)将两个不同的分析器应用于同一个分析器。
我的VB.NET有点生疏,所以我希望你不介意C#的例子。如果您正在使用dev分支中的最新代码,则Fields
刚刚添加到每个核心映射描述符中,因此您现在可以执行此操作:
client.Map<Foo>(m => m
.Properties(props => props
.String(s => s
.Name(o => o.Bar)
.Analyzer("keyword")
.Fields(fs => fs
.String(f => f
.Name(o => o.Bar.Suffix("stemmed"))
.Analyzer("snowball")
)
)
)
)
);
否则,如果您使用的是NEST 1.0.2或更早版本(您可能使用的是NEST 1.0.2或更早版本),则必须通过较早的multi field
类型方式完成此操作:
client.Map<Foo>(m => m
.Properties(props => props
.MultiField(mf => mf
.Name(o => o.Bar)
.Fields(fs => fs
.String(s => s
.Name(o => o.Bar)
.Analyzer("keyword"))
.String(s => s
.Name(o => o.Bar.Suffix("stemmed"))
.Analyzer("snowball"))
)
)
)
);
Elasticsearch支持这两种方式,并且完全相同。将keyword
分析器应用于主bar
字段,将snowball
分析器应用于bar.stemmed
字段。 stemmed
当然只是我在这些示例中选择的后缀,您可以使用您想要的任何后缀名称。实际上,您不需要添加后缀,您可以将多字段命名为与主字段完全不同的内容。