elasticsearch ElasticSearch/Nest搜索同义词、复数和拼写错误,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch ElasticSearch/Nest搜索同义词、复数和拼写错误,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch ElasticSearch/Nest搜索同义词、复数和拼写错误

elasticsearch ElasticSearch/Nest搜索同义词、复数和拼写错误,elasticsearch,nest,elasticsearch,Nest,我想执行一个实现以下项目的搜索 现在,我已经通过regex实现了所有这一切,它远没有涵盖所有内容,我想知道我可以在多大程度上使用ElasticSearch来实现这一点: 同义词 我的理解是,这是在创建索引时实现的 indexSettings.Analysis.TokenFilters.Add(“同义词”,新同义词tokenfilter{Synonyms=new[]{“tire=>tire”,“aluminal=>aluminal”},IgnoreCase=true,Tokenizer=“whi

我想执行一个实现以下项目的搜索

现在,我已经通过regex实现了所有这一切,它远没有涵盖所有内容,我想知道我可以在多大程度上使用ElasticSearch来实现这一点:

  • 同义词

    我的理解是,这是在创建索引时实现的

    indexSettings.Analysis.TokenFilters.Add(“同义词”,新同义词tokenfilter{Synonyms=new[]{“tire=>tire”,“aluminal=>aluminal”},IgnoreCase=true,Tokenizer=“whitespace”})

    但是我也需要包括复数吗?或者

  • 单数词(鞋子和鞋子应该是相同的匹配)

    这是否意味着我需要将“鞋”放在同义词列表中?还是有别的办法

  • 应允许小的拼写错误、替换和遗漏

    所以“汽车”、“自动移动”或“自动移动”将匹配。我不知道这是否可能

  • 忽略所有停止语

    现在我正在通过正则表达式删除所有的“the”、“this”、“my”等


我所有的搜索词都是简单的英文单词和数字;不允许任何其他操作。

所有这些都可以通过Elasticsearch中的实现。依次回答每个问题:

同义词

同义词可以应用于索引时间、搜索时间或两者。无论选择哪种方法

,都有权衡考虑。
  • 与在搜索时应用同义词相比,在索引时应用同义词将导致更快的搜索,代价是更多的磁盘空间、索引吞吐量以及添加/删除现有同义词的方便性和灵活性
  • 在搜索时应用同义词可以在牺牲搜索速度的情况下实现更大的灵活性

还需要考虑同义词列表的大小以及它的频率,如果有的话,它会发生变化。我会考虑这两种方法,并决定哪种方法最适合您的方案和要求。

单数词(鞋子和鞋子应该是相同的匹配)

你可以考虑使用复数和单数词根,使用基于算法或字典的词干器。也许从开始,看看它是如何为您工作的

你也应该考虑你是否还需要对原始单词表进行索引,例如,单词的精确匹配是否比词根上的词干高?

应允许小的拼写错误、替换和遗漏

考虑使用可以用来处理打字错误和拼写错误的查询。如果索引数据中存在拼写错误,则在索引之前考虑某种形式的消毒。根据所有数据存储,垃圾输入、垃圾输出:)

忽略所有停止语

使用一个删除停止词

把所有这些放在一起,一个示例分析器可能看起来像

void Main()
{
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var defaultIndex = "default-index";
    var connectionSettings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(connectionSettings);

    if (client.IndexExists(defaultIndex).Exists)
        client.DeleteIndex(defaultIndex);

    client.CreateIndex(defaultIndex, c => c
        .Settings(s => s
            .Analysis(a => a
                .TokenFilters(t => t
                    .Stop("my_stop", st => st
                        .StopWords("_english_", "i've")
                        .RemoveTrailing()
                    )
                    .Synonym("my_synonym", st => st
                        .Synonyms(
                            "dap, sneaker, pump, trainer",
                            "soccer => football"
                        )
                    )
                    .Snowball("my_snowball", st => st
                        .Language(SnowballLanguage.English)
                    )
                )
                .Analyzers(an => an
                    .Custom("my_analyzer", ca => ca
                        .Tokenizer("standard")
                        .Filters(
                            "lowercase",
                            "my_stop",
                            "my_snowball",
                            "my_synonym"
                        )
                    )
                )
            )
        )
        .Mappings(m => m
            .Map<Message>(mm => mm
                .Properties(p => p
                    .Text(t => t
                        .Name(n => n.Content)
                        .Analyzer("my_analyzer")
                    )
                )
            )
        )
    );

    client.Analyze(a => a
        .Index(defaultIndex)
        .Field<Message>(f => f.Content)
        .Text("Loving those Billy! Them is the maddest soccer trainers I've ever seen!")
    );
}

public class Message
{
    public string Content { get; set; }
}

非常感谢Russ,你不知道这有多大帮助!(我可能会带着相关问题回来:)
{
  "tokens" : [
    {
      "token" : "love",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "those",
      "start_offset" : 7,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "billi",
      "start_offset" : 13,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "them",
      "start_offset" : 20,
      "end_offset" : 24,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "maddest",
      "start_offset" : 32,
      "end_offset" : 39,
      "type" : "<ALPHANUM>",
      "position" : 6
    },
    {
      "token" : "football",
      "start_offset" : 40,
      "end_offset" : 46,
      "type" : "SYNONYM",
      "position" : 7
    },
    {
      "token" : "trainer",
      "start_offset" : 47,
      "end_offset" : 55,
      "type" : "<ALPHANUM>",
      "position" : 8
    },
    {
      "token" : "dap",
      "start_offset" : 47,
      "end_offset" : 55,
      "type" : "SYNONYM",
      "position" : 8
    },
    {
      "token" : "sneaker",
      "start_offset" : 47,
      "end_offset" : 55,
      "type" : "SYNONYM",
      "position" : 8
    },
    {
      "token" : "pump",
      "start_offset" : 47,
      "end_offset" : 55,
      "type" : "SYNONYM",
      "position" : 8
    },
    {
      "token" : "ever",
      "start_offset" : 61,
      "end_offset" : 65,
      "type" : "<ALPHANUM>",
      "position" : 10
    },
    {
      "token" : "seen",
      "start_offset" : 66,
      "end_offset" : 70,
      "type" : "<ALPHANUM>",
      "position" : 11
    }
  ]
}