一尘不染

ElasticSearch分析的字段

elasticsearch

我正在建立搜索,但需要使用不同的分析器分析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代码中使用嵌套来索引数据。

谢谢罗伯特


阅读 242

收藏
2020-06-22

共1个答案

一尘不染

您可以使用fields属性(以前称为multi
field
)将两个不同的分析器应用于同一分析器。

我的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或更早版本(可能是),则必须通过较旧的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当然,这只是我在这些示例中选择的后缀,您可以使用所需的任何后缀名称。实际上,您不需要添加后缀,您可以为多字段命名与主字段完全不同的名称。

2020-06-22