gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:15:21 25 4
gpt4 key购买 nike

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

现在我已经通过正则表达式实现了所有这些,它远没有涵盖所有内容,我想知道我可以在多大程度上使用 ElasticSearch 代替它:

  • 同义词

    我的理解是这个是在创建索引的时候实现的。

    indexSettings.Analysis.TokenFilters.Add("synonym", new SynonymTokenFilter { Synonyms = new[] { "tire => tyre", "aluminum => aluminium"}, IgnoreCase = true, Tokenizer = "whitespace"}) ;

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

  • 单数词(shoes和shoe要一模一样)

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

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

    这样 'automobile'、'automoble' 或 'automoblie' 就会匹配。我不知道这是否可能。

  • 忽略所有停用词

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

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

最佳答案

所有这一切都可以通过 configuring/writing a custom analyzer 实现 在 Elasticsearch 中。依次回答每个问题:

Synonyms

可以在索引时间、搜索时间或两者都应用同义词。无论您选择哪种方法,都需要权衡取舍

  • 与在搜索时应用相比,在索引时应用同义词会导致更快的搜索,但代价是更多的磁盘空间、索引吞吐量以及添加/删除现有同义词的简便性和灵 active
  • 在搜索时应用同义词可以以牺牲搜索速度为代价获得更大的灵 active 。

还需要考虑同义词列表的大小以及它更改的频率(如果有的话)。我会考虑同时尝试这两种方法,然后决定哪种方法最适合您的场景和要求。

Singular words (shoes and shoe should be an identical match)

您可以考虑使用 stemming使用基于算法或字典的词干提取器,将复数和单数词缩减为词根形式。也许从 English Snowball stemmer 开始看看它是如何为你工作的。

您还应该考虑是否还需要索引原始单词形式,例如精确单词匹配的排名是否应该高于其词根形式的词干词?

Small misspellings, substitutions and omissions should be allowed

考虑使用可以利用 fuzziness 的查询处理拼写错误和拼写错误。如果索引数据中存在拼写错误,请考虑在建立索引之前进行某种形式的清理。根据所有数据存储,垃圾输入,垃圾输出:)

Ignore all stop words

使用 English Stop token filter删除停用词。

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

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; }
}

my_analyzer 为以上生成以下标记

{
"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
}
]
}

关于使用同义词、复数和拼写错误的 ElasticSearch/Nest 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44443728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com