gpt4 book ai didi

lucene - 如何设置ElasticSearch以对电子邮件地址执行SQL LIKE “%”?

转载 作者:行者123 更新时间:2023-12-02 22:42:23 26 4
gpt4 key购买 nike

在SQL中,我可以使用SQL LIKE很好地搜索电子邮件地址。

使用电子邮件“stack@domain.com”,搜索“stack”,“@ domain.com”,“domain.com”或“domain”会让我找回所需的电子邮件地址。

如何通过ElasticSearch获得相同的结果?

我玩过nGram,edgeNGram,uax_url_email等,搜索结果非常糟糕。如果我写错了,请纠正我,听起来我必须执行以下操作:

index_analyzer的


  • 使用“关键字”,“空格”或“uax_url_email” token 生成器,因此电子邮件不会被 token 化
  • ,但通配符查询似乎不起作用(至少不累)
  • 使用“nGram”或​​“edgeNGram”进行过滤
  • 我总是会得到太多不必要的结果,例如在搜索“第一秒”时获得“first@domain.com”。
  • for search_analyzer
  • 不要做nGram

  • 一个实验代码
    tire.settings :number_of_shards => 1,
    :number_of_replicas => 1,
    :analysis => {
    :filter => {
    :db_ngram => {
    "type" => "nGram",
    "max_gram" => 255,
    "min_gram" => 3 }
    },
    :analyzer => {
    :string_analyzer => {
    "tokenizer" => "standard",
    "filter" => ["standard", "lowercase", "asciifolding", "db_ngram"],
    "type" => "custom" },
    :index_name_analyzer => {
    "tokenizer" => "standard",
    "filter" => ["standard", "lowercase", "asciifolding"],
    "type" => "custom" },
    :search_name_analyzer => {
    "tokenizer" => "whitespace",
    "filter" => ["lowercase", "db_ngram"],
    "type" => "custom" },
    :index_email_analyzer => {
    "tokenizer" => "whitespace",
    "filter" => ["lowercase"],
    "type" => "custom" }
    }
    } do
    mapping do
    indexes :id, :index => :not_analyzed
    indexes :name, :index_analyzer => 'index_name_analyzer', :search_analyzer => 'search_name_analyzer'
    indexes :email, :index_analyzer => 'index_email_analyzer', :search_analyzer => 'search_email_analyzer'
    end
    end

    无法正常运作的特定情况:

    带有连字符的
  • 电子邮件(例如email-hyphen@domain.com)
  • 查询字符串'@'在
  • 的开头或结尾
  • 完全匹配
  • 使用通配符(例如“@”)搜索
  • 会得到非常意外的结果。

  • 假设我有“aaa@email.com”,“aaa_0@email.com”和“aaa-0@email.com”,搜索“aaa”会给我“aaa@a.com”“aaa-0 @ email”。 com。搜索“aaa *”会给我一切,但是“aaa- *”不会给我任何东西。那么,如何使 与通配符查询完全匹配?对于这些类型的查询,对于不同的 token 生成器/分析器,我得到的结果几乎相同。

    我会在每次映射更改后执行以下操作:
    Model.tire.index.delete
    Model.tire.create_elasticsearch_index
    Model.tire.index.import Model.all

    引用文献:
  • Configure ElasticSearch to use ngram by default. - SQL LIKE %% behavior
  • http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/
  • 最佳答案

    考虑到您要完成的工作,KeywordAnalyzer可能是分析器的合理选择,尽管我看不到任何会导致WhitespaceAnalyzer出现问题的东西。

    我怀疑您在查询解析和分析时遇到了问题,尽管您并未真正描述查询的方式。最简单的情况是只使用termprefix查询。

    似乎StandardAnalyzer在大多数情况下都可以达到您的目的(区分“aaa_0”和“aaa-0”将是一个问题),只要它始终如一地应用并且您的查询正确即可。

    关于lucene - 如何设置ElasticSearch以对电子邮件地址执行SQL LIKE “%”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497018/

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