当前位置: 首页 > 面试题库 >

使用NEST的Elasticsearch:如何配置分析器以查找部分单词?

夏骏
2023-03-14
问题内容

我试图通过部分单词进行搜索,而忽略大小写并忽略某些字母的重音。可能吗?我认为使用默认标记器的ngram应该可以解决问题,但我不知道如何使用NEST来实现。

示例:“音乐”应匹配具有“音乐”的记录

我使用的Elasticsearch版本是1.9。

我正在这样做,但不起作用…

var ix = new IndexSettings();
        ix.Add("analysis",
            @"{
               'index_analyzer' : {
                          'my_index_analyzer' : {
                                        'type' : 'custom',
                                        'tokenizer' : 'standard',
                                        'filter' : ['lowercase', 'mynGram']
                          }
               },
               'search_analyzer' : {
                          'my_search_analyzer' : {
                                        'type' : 'custom',
                                        'tokenizer' : 'standard',
                                        'filter' : ['standard', 'lowercase', 'mynGram']
                          }
               },
               'filter' : {
                        'mynGram' : {
                                   'type' : 'nGram',
                                   'min_gram' : 2,
                                   'max_gram' : 50
                        }
               }
    }");
        client.CreateIndex("sample", ix);

谢谢,

大卫


问题答案:

简短答案

我认为您正在寻找的是模糊查询,该查询使用Levenshtein距离算法来匹配相似的单词。

关于nGrams的长答案

nGramhtml" target="_blank">过滤器根据定义的最小/最大范围将文本分成许多较小的标记。

例如,根据您的“音乐”查询,过滤器将生成: 'mu', 'us', 'si', 'ic', 'mus', 'usi', 'sic', 'musi', 'usic', and 'music'

如您所见musiic,与这些nGram令牌都不匹配。

为什么选择nGrams

nGrams的一个好处是,它可以 大大
加快通配符查询的速度,因为所有潜在的子字符串都是在插入时预先生成和索引的(我已经看到使用nGrams可以将查询速度从几秒提高到15毫秒)。

如果没有nGrams,则必须在查询时在每个字符串中搜索匹配项[O(n ^ 2)],而不是直接在索引[O(1)]中查找。作为伪代码:

hits = []
foreach string in index:
    if string.substring(query):
        hits.add(string)
return hits

return index[query]

请注意,这样做的代价是使插入速度变慢,需要更多的存储空间并增加了内存使用量。



 类似资料:
  • 我想为Elasticsearch中的任何索引设置一个全局分析器。 这些行被添加到elasticsearch.yaml中: 重新启动Elasticsearch后,这些行如所示http://localhost:9200/_nodes/settings 然后我用url测试http://localhost:9200/_analyze?text=时间 它显示iAnalyzer已启用。然而,当谈到http:/

  • 问题内容: 我尝试配置ElasticSearch: 这是我执行“ http://mydomain.com:9200/test/_analyze?analyzer=autocomplete&text=rih ” 时的错误 有什么问题 ?谢谢 问题答案: 该错误显示“无法找到分析器[自动完成]”。在Elasticsearch中,默认情况下您可以使用多个分析器。尽管您可以创建一个自定义分析器,但我不知道

  • 问题内容: 我最近开始使用ElasticSearch,但似乎无法让它搜索单词的一部分。 示例:我有我的ouchdb中的三个文档,在ElasticSearch中建立了索引: 所以现在,我要搜索包含“ Doe”的所有文档 那不会返回任何点击。但是如果我寻找 它确实返回一个文档(John Doeman)。 我尝试将不同的分析器和不同的过滤器设置为索引的属性。我也尝试使用完整的查询(例如: ),但似乎没有

  • 使用分配分析器工具来查找未被正确地垃圾收回收,并继续保留在内存中的对象。 分配分析器如何工作 allocation profiler(分配分析器)结合了堆分析器中快照的详细信息以及Timeline(时间轴)面板的增量更新以及追踪信息。与这些工具相似,追踪对象堆的分配过程包括开始记录,执行一系列操作,以及停止记录并分析。 分配分析器在记录中周期性生成快照(频率为每50毫秒),并且在记录最后停止时也会

  • 问题内容: 我有一个已创建的公司类型。在该公司类型的内部,我有一个名为“摘要”的字段。如何在此字段中添加多个索引分析器? 我简要地研究了使用Yakaz插件,但似乎无法与NEST一起使用。 其背后的原因是,有时用户会在查询中搜索带有句点的公司名称,而其他时候则不包括句点。我想在公司名称上使用ngram进行部分匹配,带标点和不带标点。我目前正在使用停用词过滤器来删除标点符号。 摘要字段的属性(具有多个

  • 问题内容: 我正在使用Elasticsearch构建URL索引。 我将一个URL提取为3个部分,分别是“域”,“路径”和“查询”。 例如:将分为 当我想在索引中部分搜索域时出现问题,例如“ user = who”或“ ing.com”。 甚至在索引时没有使用“ Analyzer”时,是否可以使用“ Analyzer”? 如何基于分析仪进行部分搜索? 非常感谢你。 问题答案: 2种方法: 1.通配符