Elasticssearch Nest同义词2.XX

时间:2016-10-01 20:36:59

标签: elasticsearch nest synonym

我是elasticsearch的新手,我们正在为我们的网上商店评估elasticsearch。一个重要的特征是使用同义词。遗憾的是,我无法使用同义词创建索引。请任何人可以帮助我如何使用同义词功能。我没有找到此功能和elasticsearch 2.xx的任何样本。目标应该是如果我搜索Hills,皇家的入口将被找到。

我使用以下代码:

private ElasticClient GetClient()
        {
            var node = new Uri(ES_URI);

            var uri = new Uri("http://localhost:9200");
            var settings = new ConnectionSettings(uri).DefaultIndex("product");
            var client = new ElasticClient(settings);

            return client;

        }


public void CreateSynonymIndex()
        {
            Product product = new Product()
            {
                Id = "2",
                ProductName = "Royal",
                Description = "Katzenfutter für Nierkranke"


            };


            var client = GetClient();
            client.DeleteIndex("product");
            var syn = new[] { "royal, hills => royal" };

            ICreateIndexResponse respose = client.CreateIndex("product", c => c

            .Mappings(mp => mp.Map<Product>(d => d.
              Properties(p => p.String(n => n.Name(name => name.ProductName).Index(FieldIndexOption.Analyzed)))))

               .Settings(s => s
               .Analysis(an => an
                .Tokenizers(at=>at.Pattern("synonymTokenizer",pa=>pa.Pattern("Test")))
               .Analyzers(a=>a.Custom("synonymAnalyser",ca =>ca
                .Tokenizer("synonymTokenizer")
                .Filters(new List<string> { "synonym" })))
               .TokenFilters(tf => tf
                .Synonym("synonym", sy => sy.Synonyms(syn)
               .Tokenizer("whitespace")
                .IgnoreCase(true)))))
                );

            client.Index(product);


        }

public void ES_Search()
        {
            var client = GetClient();
            var response = client.Search<Product>(search => search
    .Query(q => q.Bool(b => b
        .Should(
           // s => s.Match(m => m.Query("sometest").Field(f => f.ProductName).Boost(1.1)),
            s => s.Match(m => m.Query("hills").Field(f => f.ProductName).Fuzziness(Fuzziness.EditDistance(1)))
        ))));

            var response1 = client.Search<Product>(s => s.Query(q => q.Term(p => p.ProductName, "hills")));

}

此致

多米尼克

1 个答案:

答案 0 :(得分:1)

您已使用同义词创建了分析器,但您没有使用它。您需要告诉elasticsearch ProductName字段应使用synonymAnalyser分析器。

.Mappings(mp => mp.Map<Product>(d => d.
    Properties(p => p.String(n => n
        .Name(name => name.ProductName)
        .Analyzer("synonymAnalyser")
        .Index(FieldIndexOption.Analyzed)))))

我注意到了更多的事情:

  • 记得调用client.Index(..)方法后,弹性搜索中的文档无法立即显示。这需要几毫秒。在索引文档后立即搜索,您可能找不到它。您可以阅读更多相关信息here

  • 我不知道您是否使用默认索引创建ElasticClient,因为您没有共享它。如果没有,则必须在搜索电话中指定,例如 client.Search<Product>(s => s.Index("product"))

希望对你有所帮助。