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

2023-12-13

我试图按部分单词进行搜索,忽略大小写并忽略某些字母的重音。是否可以?我认为带有默认分词器的 ngram 应该可以解决问题,但我不明白如何使用 NEST 来做到这一点。

示例:“musiic”应匹配包含“music”的记录

我使用的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);

Thanks,

David


简答

我想你正在寻找的是模糊查询,它使用编辑距离匹配相似单词的算法。

nGrams 的长答案

nGram 过滤器根据定义的最小/最大范围将文本分割成许多较小的标记。

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

如你看到的musiic与这些 nGram 标记中的任何一个都不匹配。

为什么选择 nGram

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

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

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

vs

return index[query]

请注意,这是以插入速度变慢、需要更多存储空间以及占用更多内存为代价的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词? 的相关文章

随机推荐

  • 在另一个 JNI 函数中使用时 Oop 被损坏

    问题是我们可以缓存吗jclass and jmethodID跨不同的 JNI 方法调用 当尝试使用缓存创建某个特定类的对象时 我遇到了一些奇怪的行为jclass and jmethodID来自另一个 JNI 方法调用 这是一个简单的例子 p
  • 在哪里可以找到一个好的 JavaScript/HTML AutoSuggest 示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找 JavaScr
  • 从派生类访问基类中的类型别名[重复]

    这个问题在这里已经有答案了 当尝试从派生类访问基类中的类型别名时 我面临以下问题 template
  • WebView动态插入/修改内容

    在我的应用程序中 我使用 WebView 来显示内容 现在是否可以动态修改内容 需求是这样的 我将从网络获取信息 并根据它们我需要设置样式 字体 属性 或者当连接的设备没有响应时我可能需要附加新文本 到目前为止我正在使用以下代码 void
  • Java webstart max-heap-size导致JVM无法启动

    我们在客户端使用 java web start 来构建基于 java swing 的应用程序 最近 当单击 jnlp 链接时 我们遇到了一个奇怪的 无法启动 java 虚拟机 错误 我们很快就发现了这一点 因为 jnlp 文件中的 max
  • 如何解决循环引用?

    如何解决循环引用问题 例如 A 类将 B 类作为其属性之一 而 B 类将 A 类作为其属性之一 架构师该如何解决这类问题呢 如果以NHibernate为例 对象之间就会存在父子关系 它如何处理这些父子场景 在大多数情况下 当我必须让两个事物
  • 使用 Paramiko 将文件从远程目录复制到远程子目录

    如何复制远程服务器中的文件 maindir fil1 txt到子目录 maindir subdir file1 txt 我使用 SFTP 实现paramiko 但它总是检查要复制的本地路径 filename full path maindi
  • 未找到类定义错误 (android)

    我正在开发一个应用程序 我可以启动我的启动器活动 它有两个按钮 单击这些按钮中的任何一个时 都应该打开一个新活动 但是 随后会发生运行时错误 import android app Activity import android conten
  • 禁用 Laravel 内置的错误处理方法

    有没有办法一起禁用 Laravel 错误处理程序 我想简单地显示标准 PHP 错误 not the Whoops looks like something went wrong errors 这会严重违反框架的原则 如果您仍然感兴趣 我将在
  • 连接具有不同数据类型的两个表 MS ACCESS -“表达式中的类型不匹配”错误

    我正在尝试使用两个实时 CSV 运行访问查询 这两个 CSV 具有不同数据类型 数字和短文本 的公共字段 我发现您可以使用 CStr 连接不同的数据类型 我已将 CStr 添加到 sql 视图上的代码中 请找到下面的代码 这为我提供了我想要
  • 如何在Windows Phone中创建SESSION

    string uname txt1 Text string pwd txt2 Text NavigationService Navigate new Uri newPage xaml name uname pwd pwd UriKind R
  • 使用 Swift 在一个 ViewController 中强制横向模式

    我试图在横向模式下仅强制我的应用程序中的一个视图 我正在打电话 override func shouldAutorotate gt Bool print shouldAutorotate return false override func
  • AVFoundation 重现视频循环

    我需要在 OpenGL 应用程序中无限期地重现视频 视频结束时重新启动 为此 我尝试利用 AV 基础 我创建了一个 AVAssetReader 和一个 AVAssetReaderTrackOutput 并利用 copyNextSampleB
  • 从文本中获取CGPath

    海吉同志们 我目前正在尝试将一个字母和 或多个字母转换为 CGPathRef 以便手动将它们绘制到自定义 UIView 中 我尝试了 CoreText 和 Framesetters 的方法 包括这个小片段 但它似乎不起作用 NSAttrib
  • 如何从 subprocess.communicate() 捕获 python 中的流输出

    目前 我有这样的事情 self process subprocess Popen self cmd stdout subprocess PIPE out err self process communicate 我正在运行的命令会流式传输输
  • 自动完成查找字符串包含的符号而不是开头的符号

    我正在编写一个程序 该程序在某一时刻实现了TextBox具有自动完成功能 目前 为了简单起见 我正在使用CustomSource在设计时手动填充多个条目 虽然自动完成工作正常 但我希望它提出的建议不仅仅是从 开始当前输入的文本 但是包含它在
  • Python在Words文档中查找替换字符串并在字符串之前创建两个段落

    我有一个 VBA 宏 在那方面 我有 Find Text Pollution Replacement Text p pChemical Here p pChemical 表示将 污染 一词替换为 化学 并在 海洋 一词之前创建两个空段落 B
  • 通过隐藏字段内的 ID 删除表行

    我有一个表 它在 JSP 中的 while 循环中生成其行 如下所示 我在每行中使用隐藏字段来获取特定 ID 并将其 POST 到 servlet tr td td tr
  • 优点、问题、向 iOS 应用程序添加另一个 UIWindow 的示例?

    最近我一直想知道 iOS 应用程序只有一个UIWindow 创建另一个似乎不是问题UIWindow并将其放置在屏幕上 我的问题有点模糊 但我感兴趣的是 第二次我可以实现什么目标UIWindow不能用其他方式做到吗 使用多个时可能会出现什么问
  • 使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?

    我试图按部分单词进行搜索 忽略大小写并忽略某些字母的重音 是否可以 我认为带有默认分词器的 ngram 应该可以解决问题 但我不明白如何使用 NEST 来做到这一点 示例 musiic 应匹配包含 music 的记录 我使用的Elastic