Elasticsearch 中的通配符搜索或部分匹配

2023-12-28

我试图向最终用户提供搜索类型,这更像是 sqlserver。 我能够为给定的sql场景实现ES查询:

select * from table where name like '%pete%' and type != 'xyz and type!='abc'

但是ES查询对于这个sql查询不起作用

select * from table where name like '%peter tom%' and type != 'xyz and type!='abc'

在我的弹性搜索以及通配符查询中,我还需要执行一些布尔过滤查询

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "query": {
                "wildcard": {
                  "name": { "value": "*pete*" }
                }
              }
            }
          ],
          "must_not": [
            {
              "match": { "type": "xyz" }
            },
            {
              "match": { "type": "abc" }
            }
          ]
        }
      }
    }
  }
}

上面带有通配符搜索的弹性查询工作正常,并为我提供了所有与 pete 匹配且不是 xyz 和 abc 类型的文档。但是当我尝试使用由空格分隔的 2 个单独单词执行通配符时,相同的查询返回空,如图所示下面。例如

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "query": {
                "wildcard": {
                  "name": { "value": "*peter tom*" }
                }
              }
            }
          ],
          "must_not": [
            {
              "match": { "type": "xyz" }
            },
            {
              "match": { "type": "abc" }
            }
          ]
        }
      }
    }
  }
}

我的映射如下:

{
  "properties": {
    "name": {
      "type": "string"
    },
    "type": {
      "type": "string"
    }
  }
}

我应该使用什么查询才能对以空格分隔的单词进行通配符搜索


最有效的解决方案涉及利用ngram 分词器 https://www.elastic.co/guide/en/elasticsearch/reference/2.1/analysis-ngram-tokenizer.html为了标记你的部分name场地。例如,如果您的名字类似于peter tomson,ngram 分词器将对其进行分词和索引,如下所示:

  • pe
  • pet
  • pete
  • peter
  • peter t
  • peter to
  • 彼得·汤姆
  • 彼得·汤姆斯
  • 彼得·托姆索
  • 彼得·汤姆森
  • 特汤森
  • 埃尔·汤普森
  • r tomson
  • tomson
  • tomson
  • omson
  • mson
  • son
  • on

因此,当它被索引时,搜索任何这些标记将检索您的文档peter thomson in it.

让我们创建索引:

PUT likequery
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "my_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "nGram",
          "min_gram": "2",
          "max_gram": "15"
        }
      }
    }
  },
  "mappings": {
    "typename": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "search": {
              "type": "string",
              "analyzer": "my_ngram_analyzer"
            }
          }
        },
        "type": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

然后,您将能够使用简单且非常高效的方式进行搜索term query:

POST likequery/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "name.search": "peter tom"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "type": "xyz"
          }
        },
        {
          "match": {
            "type": "abc"
          }
        }
      ]
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 中的通配符搜索或部分匹配 的相关文章

随机推荐

  • TextUtils.isEmpty() 方法对于空字符串返回 false

    我有下面的测试返回 false 我错过了什么吗 TextUtils isEmpty 更新 由于某种原因 我无法回答我的问题或添加评论 我正在运行 JUNit 测试用例 而不是仪器测试用例 正如我所建议的 我发现当我们不作为仪器运行时 上述方
  • php db 变量中的下划线导致问题

    我将数据库的所有登录信息存储在公共树之外的变量中 例如 hostname 172 0 0 0 dbname myname mydbname username myname user pw password 这是相当标准的 问题是我正在使用的
  • git 索引损坏

    由于某种原因 我的 Git 索引文件不断损坏 例如 如果我这样做git status I get 错误 索引文件 sha1 签名错误和致命 索引文件损坏 这种情况已经在我身上发生过好几次了 我想这可能与我的开发环境有关 我在 Mac 上工作
  • 如何在JHipster中创建具有集合类型字段的实体?

    在我们的项目中 我们使用领域模型Document A document可能有几个titles 所以用我的 JPA 知识我会建模Document像这样的实体 Entity public class Document private Set
  • 使用 JPA 覆盖 @MappedSuperclass 中定义的 @Id

    我有一个 AbstractEntity 类 它由我的应用程序中的所有实体扩展 并且基本上充当标识符提供者 MappedSuperclass public class AbstractEntity implements DomainEntit
  • 在什么情况下 ARSCNView.raycastQuery 返回 nil?

    在我的渲染器委托中 我从视图中心创建一个光线投射查询 以跟踪估计的平面并显示跟随光线投射结果的 3D 指针 它是通过以下方式完成的view raycastQuery from allowing alignment 但返回的是零 我的问题是为
  • 如何查看 JAVA 中完整的异常日志? [复制]

    这个问题在这里已经有答案了 当我用命令运行一些java程序时java 异常测试 有时会省略异常 看起来像 Exception in thread main java lang NoClassDefFoundError aa bb DD at
  • 如何测试字典是否包含某些键

    有没有一个好的方法来测试字典是否包含多个键 简短版本 d if a in d and b in d and c in d pass do something Thanks 编辑 我只能使用python2 4 您可以使用set issubse
  • 我可以有一个对特征对象的静态借用引用吗?

    有没有办法让我获得对结构的特征实现的静态借用引用 trait Trait struct Example impl Trait for Example 这工作正常 static instance1 Example Example 这也可以正常
  • AngularJS 指令中的 ASP.NET MVC 部分视图

    我目前正在开发一个 ASP NET MVC 项目 其中添加了一些 AngularJS 包括一些 AngularJS 指令 我需要向 AngularJS 指令添加 MVC 部分视图 明显地 Html Partial PartialView n
  • 如何使用 Apache CXF 表示没有时区的日期?

    我有一个 WSDL 将元素的类型指定为 xs date 当我使用 Apache CXF 生成 Java 类时 它将变量呈现为 javax xml datatype XMLGregorianCalendar 到目前为止一切都很好 当 CXF
  • Javascript 文件依赖项 - 选择性加载资源文件并防止重复

    这可能更像是一场哲学辩论 但我的观点如下 两个控件共享一个 Javascript 资源库来调用 Web 服务 它们通常相互结合使用 但并非总是如此 它们引用的 javascript 文件不容易分开 不应将 javascript 文件添加到应
  • Ext JS 4:Ext JS 版本 4.1.1 中的 JavaScript 异常“TypeError:Ext.resetElement 未定义”

    Ext JS 4 1 1 破坏了我使用 ASP NET 设置的代理 我不得不切换回 4 1 0 版本来解决该问题 只是想我会把这个问题扔在那里 直到 Sencha 解决为止 JavaScript 异常 TypeError Ext reset
  • 在discord.py 中播放音轨队列

    所以我在discord py 上制作了这个音乐discord 机器人 该机器人仅播放我计算机上本地 mp3 文件的播放列表 所以我有一个播放队列的函数 它是这样的 def play song ctx voice if len queue 0
  • 使用 FFMPEG 将 .mp4 转换为 .webm

    如果有人可以帮助我将其设置为 2 或 3 遍命令 在 Windows7 x64 的命令提示符中使用 FFmpeg Win64 Static build by Kyle Schwarz Compiled on Sep 19 2012 16 3
  • 获取PostGIS版本

    我如何知道我拥有哪个版本的 PostGIS 由于某些功能依赖于其他库 例如 GEOS 和 proj4 您可能也想获取它们的版本 然后使用 SELECT PostGIS full version
  • Java 的 Facebook Messenger bot 对象结构

    有没有人创建过一个开源项目 用 java 公开 facebook Messenger bot API 或者我可以转换的另一种语言 本质上是堆栈的对象层次结构 位于 https developers facebook com docs mes
  • 在 Angularjs 中提交后重置表单

    您好 我有一个可以在单击按钮时更新的表单 scope action Update var id routeParams editId scope item updateRecord get id id 更新项目后 不会删除表单字段中输入的信
  • CSS 样式无法识别数字[重复]

    这个问题在这里已经有答案了 可能的重复 CSS 类名中哪些字符有效 https stackoverflow com questions 448981 what characters are valid in css class names
  • Elasticsearch 中的通配符搜索或部分匹配

    我试图向最终用户提供搜索类型 这更像是 sqlserver 我能够为给定的sql场景实现ES查询 select from table where name like pete and type xyz and type abc 但是ES查询