【问题标题】:Exact search with ElasticSearch using EdgeNGram使用 EdgeNGram 使用 ElasticSearch 进行精确搜索
【发布时间】:2017-03-14 13:19:35
【问题描述】:

我正在使用弹性搜索希腊语和拉丁语字符。我的主要问题是我无法进行精确搜索。我在索引上使用 edgeNgram 过滤器,但我想根据搜索时间控制它的最小值和最大值到我的字长。例如,如果我输入“titanox”,我将首先得到“ΤΙΤΑΝΙΟΥ”,然后是“TITANOX”。这是我的索引创建:

var response = client.CreateIndex(index, s => s
            .Settings(s1 => s1
.NumberOfShards(5)
.NumberOfReplicas(5)
.Analysis(a => a.TokenFilters(t => t.IcuTransform("greeklatin", it => it.Id("Greek-Latin; NFD; [:Nonspacing Mark:] Remove; NFC")//
.Direction(IcuTransformDirection.Forward)) //
.IcuTransform("latingreek", lg => lg.Id("Greek-Latin; NFD; [:Nonspacing Mark:] Remove; NFC")
.Direction(IcuTransformDirection.Reverse))
.EdgeNGram("greekedge", ed => ed.MaxGram(7)
.MinGram(1)
.Side(EdgeNGramSide.Front))
.Stop("greekstop", sw => sw.StopWords())
.Lowercase("greeklowercase", gl => gl.Language(Language.Greek.ToString()))
.KeywordMarker("greekkeywords", gk => gk.Keywords(""))
.Stemmer("greekstemmer", gs => gs.Language(Language.Greek.ToString())))
.Analyzers(a1 => a1
.Custom("greek", t => t.Tokenizer("standard")
.Filters("greekedge", "greekstop", "greeklowercase", "greekkeywords", "greekstemmer", "greeklatin")))))
.Mappings(m => m.Map(type, mt => mt.Properties(c => c.Text(c1 => c1.Name("id").Analyzer("greek"))
.Text(c2 => c2.Name("brand").Analyzer("greek"))
.Text(c3 => c3.Name("service").Analyzer("greek"))
.Text(c4 => c4.Name("servicegroupdesc").Analyzer("greek"))
.Text(c5 => c5.Name("servicecategorydesc).Analyzer("greek"))
.Text(c6 => c6.Name("partscategory").Analyzer("greek"))
.Text(c7 => c7.Name("partsid").Analyzer("greek"))
.Text(c8 => c8.Name("partsdesc").Analyzer("greek"))))));

这里是我的搜索

   var response = client.Search<Cars>(n => n
                        .Index(index)
                        .Type(type)
                        .Query(m => m.MultiMatch(q => q
                            .Analyzer(analyzername)
                            //.MinimumShouldMatch("100%")
                            .Query("*" + searchWord + "*")
                            .Fields(f=>f.Field(fieldsForSearchList[0]))
                            .Fuzziness(Fuzziness.EditDistance(0))))
                        .Size(searchSize)
                        .From(0)
                        .TrackScores(true)

                    );

【问题讨论】:

  • 您能解决问题中的缩进吗?任何人都将更难阅读和帮助它的方式
  • 我认为问题是使用edgeNgram产生的,但是如何解决?

标签: c# elasticsearch nest


【解决方案1】:

一个可能会有所帮助的解决方案是向此查询添加一个新查询,以增强用户键入的字词。这可以实现更精确的搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2012-09-22
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多