Elasticsearch 自定义分析器,带有 ngram,连字符上没有单词分隔符

2023-12-02

我正在尝试索引包含连字符但不包含空格、句点或任何其他标点符号的字符串。我不想根据连字符分割单词,而是希望连字符成为索引文本的一部分。

例如,我的 6 个文本字符串是:

  • 杂志播放
  • 马杂志
  • 在线杂志
  • 最佳杂志
  • 杂志之友
  • 杂志玩游戏

我希望能够在这些字符串中搜索包含“玩”的文字或对于以“杂志”开头的文字.

我已经能够使用ngram使包含“play”的文本正常工作。但是,连字符导致文本分割,并且它包含连字符后面的单词中“杂志”的结果。我只希望出现以“magazine”开头的字符串。

根据上面的示例,当以“magazine”开头时,只有这 3 个应该出现:

  • 杂志播放
  • 马杂志
  • 杂志玩游戏

请帮助我的 ElasticSearch 索引示例:

DELETE /sample

PUT /sample
{
    "settings": {
        "index.number_of_shards":5,
        "index.number_of_replicas": 0,
        "analysis": {
            "filter": {
                "nGram_filter": {
                   "type": "nGram",
                   "min_gram": 2,
                   "max_gram": 20,
                   "token_chars": [
                      "letter",
                      "digit"
                   ]
                },
                "word_delimiter_filter": {
                    "type": "word_delimiter",
                    "preserve_original": true,
                    "catenate_all" : true
                }
             },
          "analyzer": {
            "ngram_index_analyzer": {
              "type" : "custom",
              "tokenizer": "lowercase",
              "filter" : ["nGram_filter", "word_delimiter_filter"]
            }
          }
        }
    }
}
PUT /sample/1/_create
{
    "name" : "magazineplayon"
}
PUT /sample/3/_create
{
    "name" : "magazineofhorses"
}
PUT /sample/4/_create
{
    "name" : "online-magazine"
}
PUT /sample/5/_create
{
    "name" : "best-magazine"
}
PUT /sample/6/_create
{
    "name" : "friend-of-magazines"
}
PUT /sample/7/_create
{
    "name" : "magazineplaygames"
}

GET /sample/_search
{
"query": {
        "wildcard": {
          "name": "*play*" 
        }
    }
}

GET /sample/_search
{
"query": {
        "wildcard": {
          "name": "magazine*" 
        }
    }
}

Update 1我更新了所有创建语句以在示例后使用 TEST:

PUT /sample/test/7/_create
{
    "name" : "magazinefairplay"
}

然后,我运行以下命令以仅返回其中包含“play”一词的名称,而不是进行通配符搜索。这工作正常并且只返回两条记录。

POST /sample/test/_search
{
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": [
                {"match": { "name.substrings": "play" }}
            ]
        }
    }
}

我运行以下命令仅返回以“magazine”开头的名称。我的预期是“在线杂志”、“最佳杂志”和“杂志之友”不会出现。然而,包括这三项在内,所有七项记录均被退回。

POST /sample/test/_search
{
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": [
                {"match": { "name.prefixes": "magazine" }}
            ]
        }
    }
}

有没有办法过滤掉使用连字符的前缀?


您走在正确的道路上,但是,您还需要添加另一个利用edge-ngram令牌过滤器为了使“开始于”约束起作用。您可以保留ngram用于检查“包含”给定单词的字段,但您需要edge-ngram检查字段是否“以”某个标记开头。

PUT /sample
{
  "settings": {
    "index.number_of_shards": 5,
    "index.number_of_replicas": 0,
    "analysis": {
      "filter": {
        "nGram_filter": {
          "type": "nGram",
          "min_gram": 2,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit"
          ]
        },
        "edgenGram_filter": {
          "type": "edgeNGram",
          "min_gram": 2,
          "max_gram": 20
        }
      },
      "analyzer": {
        "ngram_index_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "nGram_filter"
          ]
        },
        "edge_ngram_index_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "edgenGram_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "prefixes": {
              "type": "string",
              "analyzer": "edge_ngram_index_analyzer",
              "search_analyzer": "standard"
            },
            "substrings": {
              "type": "string",
              "analyzer": "ngram_index_analyzer",
              "search_analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

那么你的查询将变成(即搜索其name字段包含play或开始于magazine)

POST /sample/test/_search
{
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": [
                {"match": { "name.substrings": "play" }},
                {"match": { "name.prefixes": "magazine" }}
            ]
        }
    }
}

注意:不要使用wildcard用于搜索子字符串,因为它会降低集群的性能(更多信息here and here)

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

Elasticsearch 自定义分析器,带有 ngram,连字符上没有单词分隔符 的相关文章

  • 如何修改 Elasticsearch 文档的 _source 字段

    问题 有没有办法从文档的 source 中清除 html html 的剥离可以是周期性的 触发的 或者理想情况下是在索引时即时进行的 我将数据输入到elasticsearch中 并针对分析器进行索引 该分析器在索引之前剥离不需要的htmls
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 如何使用 monolog ElasticSearchHandler 登录 Laravel 应用程序

    Monolog 包含弹性搜索处理程序和格式化程序 但它作为自定义通道对 Laravel 的实现并不像 Laravel 文档网站上描述的那么简单 以下是如何执行此操作的简要分步说明 为您的弹性搜索日志记录创建一个配置文件 config ela
  • Elasticsearch GET API 获取分片大小

    在 Elasticsearch 2 3 3 中 有没有办法使用返回 JSON 的 GET API 获取分片大小 目前我找到了以下几种获取shard size的方法 这两种方法都存在问题 recovery gt 使用 JSON 进行响应并提供
  • Antlr3 匹配没有空格的标记

    给定输入 term gt 1 数字 1 和比较运算符 gt 应该在 AST 中生成单独的节点 如何才能实现这一目标 在我的测试中 仅当 c 和 1 用空格分隔时才会发生匹配 如下所示 term lt 1 当前语法 startExpressi
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • ElasticSearch:从 Painless 脚本中的嵌套字段计算 arcDistance

    我需要计算 Painless 脚本内的弧距 但在这种情况下还没有找到访问 geo API 的方法 即 第一点作为参数传递给脚本 这意味着我只获得原始值 第二点是从嵌套文档中读取的 这意味着我无法使用doc myGeoField value
  • 在嵌套热门点击聚合中包含父 _source 字段

    我正在尝试聚合一个字段并使用top hits但我想在响应中包含未包含在嵌套属性映射中的其他字段 目前如果我指定 source include 我只能获取当前嵌套属性中的字段 这是我的映射 my cart mappings propertie
  • Spring Data elasticsearch @Query 注解嵌套对象

    我有两节课 Document public class PracticeQuestion private int userId private List
  • 查询格式错误,查询名称后没有 start_object

    我正在针对 AWS Elasticsearch 5 1 运行此查询并收到格式错误的查询错误 这是请求的正文 我基本上只是检查该字段在时间范围内是否存在 query bool filter bool must range timestamp
  • `docker-compose up` 与使用环境变量的 `docker compose up`

    我正在尝试使用 Docker Compose 将三节点 Elasticsearch 集群部署到 Azure 容器实例 我松松地跟随这个例子 https www elastic co guide en elasticsearch refere
  • Elasticsearch 中的组合非嵌套和嵌套查询

    我想使用 ES 进行书籍搜索 所以我决定将作者姓名和标题 作为嵌套文档 放入索引中 如下所示 curl XPUT localhost 9200 library search books 1 d author one books title
  • Elasticsearch 与 Cassandra 对比 Elasticsearch 与 Cassandra

    我正在学习 NoSQL 并正在寻找满足客户要求之一的不同选项 在提出这个问题之前我已经查阅了各种资源 一个对NoSQL知之甚少的人 我需要以更快的速度存储数据并读取数据 完全故障安全且易于扩展 能够搜索数据进行分析 我最终得到了一个简短的清
  • 如何管理 Elasticsearch 中的架构/映射迁移/演变?

    Flyway https flywaydb org是 RDBMS 领域中非常方便的模式迁移 演化工具 我正在为 ES 寻找类似的东西 尽管 ES 与 RDBMS 不同 而且我明白 像 Flyway 这样的工具的全部要点基本上是在多种环境例如
  • 关于大O和大Omega的问题

    我认为这可能是一个关于大 O 表示法的初学者问题 举例来说 我有一个算法 可以递归地分解整个列表 O n 然后将其重新组合在一起 O n 我假设这意味着效率为 O n O n 这是否可以简化为 2O n O 2n 或 O n 根据我对这种表
  • 在elasticsearch中搜索字幕数据

    有以下数据 简单的srt 1 00 02 17 440 gt 00 02 20 375 Senator we re making our final 2 00 02 20 476 gt 00 02 22 501 approach into
  • 如何将不带空格的单词与带空格的 ElasticSearch 数据进行匹配

    在我的elasticsearch中 我有数据 New York 我想查询并匹配 NewYork 请注意查询字符串中没有空格 我怎样才能实现这个目标 有什么分析仪可以在这里提供帮助吗 我认为你可以申请木瓦令牌过滤器 https www ela
  • 需要仅返回 Elasticsearch 中具有完整父主体的匹配嵌套对象

    我在我的项目中使用 Elastic search 1 7 版本 我有一个名为colleges在该索引下有一个嵌套索引名称courses像这样 name College Name university University Name city
  • 有人可以简单解释一下自然语言处理的要素吗?

    我是自然语言处理的新手 对所使用的术语感到困惑 什么是代币化 POS 标签 实体识别 标记化只是将文本分割成可以有意义的部分或为这些部分赋予含义 以及含义 当我确定某物是名词 动词或形容词时 它的名字是什么 如果我想分为日期 姓名 货币呢
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o

随机推荐

  • 如何将词云放入grob中?

    我创建了一个简单的词云 require wordcloud words lt c affectionate ambitious anxious articulate artistic caring contented creative cy
  • 使用 BeautifulSoup 的 Python 进行网页抓取 429 错误

    首先 我不得不说我对使用 Python 进行 Web 抓取还很陌生 我正在尝试使用这些代码行来抓取数据 import requests from bs4 import BeautifulSoup baseurl https name of
  • Angular 2路由到同一路由

    I have Ride组件 并在骑行结束时Ride Summary显示 右侧的摘要有一个 开始另一次骑行 按钮 该按钮会重定向到同一组件 Ride routerLink Ride 自从Ride组件已经是我所在的组件 它没有刷新并且Ride
  • 使用 C 结构成员的连续内存

    在将其标记为重复之前 请先阅读问题 所以这可能是一个潜在的非常愚蠢的问题 但它困扰着我 我从阅读以及许多其他问题中知道 由于编译器添加的填充 C 结构中的字段不能保证是连续的 例如 根据C标准 13 在结构体对象中 非位域成员和位域所在的单
  • Javascript 在重新加载或重定向之前删除 cookie

    我需要删除一个cookie并且then进行重定向 然而 在处理重定向之前 cookie 不会被删除 问题是 如果执行重定向时 cookie 仍然存在 则重定向会被拦截并发送到预期页面以外的页面 很奇怪 我知道 说来话长 是否有可能欺骗浏览器
  • 如何使用其他Facebook帐户登录?

    我关注了本教程制作一个小应用程序来登录并打招呼 用户名 问题是 我只能使用我的帐户登录 但无法使用其他帐户登录 此问题发生在一些需要登录的示例代码 例如 HelloFacebookSample 或 Scrumptious 中 Logcat
  • 如何在Python中合并2列

    假设我使用 numpy 定义了一个 2x2 矩阵 array 1 2 2 3 现在另一个 2x1 矩阵 array 3 4 如何按列连接这两个矩阵 使其变为 array 1 2 3 2 3 4 我怎样才能删除指定列 这样它就会变成 arra
  • 使用正确的网格在 R 中绘制 netcdf

    我的目标是在世界地图上绘制硝酸盐 no3 数据 使用这些数据的正确经度和纬度 有两个 netcdf 文件 1 与数据 2 与网格信息 数据摘要信息 no3 是长度为 x y sigma 的数组 no3 df 是 x y 观测值 3 个变量
  • 在 IE7 中使用 Prawn 生成 Rails PDF

    我正在使用 Prawn 和 Prawnto 在 Ruby on Rails 应用程序 Rails 版本 2 2 2 中生成 PDF 该应用程序运行良好 可以愉快地生成 PDF 并将其发送给用户以在 Firefox 中下载 问题出在IE7上
  • 使用 PHP 在 Windows 中获取文件所有者

    在 Windows 上提供文件路径并获取其所有者用户名 当然 fileowner在这里是没用的 有什么 PECL 扩展可以提供帮助吗 编辑 也可以使用的替代方案 从 DOC 文件中读取摘要数据 以检索作者 编辑2 使用找到了解决方案COM
  • 在中心找不到工件 javax.sql:jdbc-stdext:jar:2.0 (https://repo.maven.apache.org/maven2)

    我正在尝试构建为我的项目创建的 Web 服务的 REST API 我的网络服务运行没有问题 现在 我想在远程服务器上部署我的服务 并且我需要生成war file 我使用 Java Eclipse 和 Maven 作为依赖项 我试着做一个全新
  • 如何使“%bp.hap.run-until name = X86_HLT_Instr”工作?

    从命令行模拟执行二进制文件 建议使用 bp hap run until name X86 HLT Instr 这是我的完整脚本 run command file targets qsp x86 firststeps no network s
  • 在android中解析11MB的大json[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我在使用 GSON 和 J
  • wakeLock 不等待网络连接

    我使用唤醒锁作为警报来定期更新应用程序状态 三星手机上的 WiFi 需要一段时间才能连接 还有 Wifi 上的 保持唤醒 选项does not在三星手机上工作 他们也没有兴趣解决这个问题 因此 当唤醒锁确实发生时 它应该等待 wifi 连接
  • 为什么maven依赖中的版本号有时会被跳过?

    我对 Maven 的功能还很陌生 我发现在 pom xml 中放置依赖项的地方 有时只提到 groupID 和artifact id 而跳过 version 为什么是这样 例如以下依赖项来自 springsource 网站http spri
  • 在 Sympy 中部分分解表达式

    Suppose I have an expression of the form I know that I can simplify the expression like so However sympy simplify and sy
  • iBooks图书馆般的效果

    谁能告诉我如何实现 iBooks Library 翻页效果 不是翻页 也许可以通过核心动画来实现吗 这就是您搜索的内容 它的代码非常少 并且完全在 CoreAnimation 中完成 https github com devindoty i
  • cx_Freeze:导入错误:没有名为“PyQt5.Qt”的模块

    我正在尝试使用构建我的 GUI 应用程序cx Freeze The setup py如下 from cx Freeze import setup Executable import os import sys base None if sy
  • PHP Preg_match 精确匹配单词

    我已存储为 1 7 11 我需要使用 preg match 来检查 7 有没有或 11 有吗等等 我该怎么做 Use b在表达式之前和之后仅将其作为整个单词进行匹配 str1 foo bar has matches foo bar str2
  • Elasticsearch 自定义分析器,带有 ngram,连字符上没有单词分隔符

    我正在尝试索引包含连字符但不包含空格 句点或任何其他标点符号的字符串 我不想根据连字符分割单词 而是希望连字符成为索引文本的一部分 例如 我的 6 个文本字符串是 杂志播放 马杂志 在线杂志 最佳杂志 杂志之友 杂志玩游戏 我希望能够在这些