我正在建立搜索,但需要使用不同的分析器分析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代码中使用嵌套来索引数据。
谢谢罗伯特
您可以使用fields属性(以前称为multi field)将两个不同的分析器应用于同一分析器。
fields
我的VB.NET有点生锈,所以希望您不要介意C#示例。如果您使用的是dev分支中的最新代码,那么Fields它只是添加到每个核心映射描述符中,因此您现在可以执行以下操作:
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或更早版本(可能是),则必须通过较旧的multi field类型方法来完成此操作:
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当然,这只是我在这些示例中选择的后缀,您可以使用所需的任何后缀名称。实际上,您不需要添加后缀,您可以为多字段命名与主字段完全不同的名称。
keyword
bar
snowball
bar.stemmed
stemmed