首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticssearch同义词2.XX

Elasticssearch同义词2.XX
EN

Stack Overflow用户
提问于 2016-10-01 20:36:58
回答 1查看 289关注 0票数 1

我是elasticsearch的新手,我们正在为我们的网络商店评估elasticsearch。一个重要的特点是同义词的用法。不幸的是,我无法用同义词创建索引。请任何人帮助我如何使用同义词功能。我没有为这个特性和ElasticSearch2.xx找到任何示例。目标应该是,如果我寻找山,皇家的入口将被找到。

我使用以下代码:

代码语言:javascript
复制
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")));

}

致以敬意,

多米尼克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-05 08:11:25

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

代码语言:javascript
复制
.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中的文档不会立即可用。需要几毫秒。在索引文档之后立即搜索,您可能找不到它。您可以阅读更多关于它的这里
  • 我不知道您是否创建了默认索引的ElasticClient,因为您没有共享它。如果没有,则必须在搜索调用(例如client.Search<Product>(s => s.Index("product")) )中指定它。

希望这对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39811219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档