ElasticSearch分析了字段

时间:2014-08-21 17:43:28

标签: vb.net elasticsearch nest

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

由于 罗伯特

1 个答案:

答案 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当然只是我在这些示例中选择的后缀,您可以使用您想要的任何后缀名称。实际上,您不需要添加后缀,您可以将多字段命名为与主字段完全不同的内容。