Elasticsearch 嵌套同义词 2.XX

Elasticssearch Nest Synonyms 2.XX

我是 elasticsearch 的新手,我们正在为我们的网上商店评估 elasticsearch。一个重要的特点是同义词的使用。不幸的是,我无法使用同义词创建索引。请任何人帮助我如何使用同义词功能。我没有找到此功能和 elasticsearch 2.xx 的任何示例。目标应该是如果我搜索 Hills 就会找到 Royal 的条目。

我使用以下代码:

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")));

}

此致,

多米尼克

您创建了带有同义词的分析器,但您没有使用它。您需要告诉 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(..) 方法后,文档不会立即在 elasticsearch 中可用。这将需要几毫秒。索引文档后立即搜索,您可能找不到它。您可以阅读更多相关信息 here

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

希望对你有所帮助。