【问题标题】:Elasticsearch: custom analyzer while queryingElasticsearch:查询时的自定义分析器
【发布时间】:2019-07-27 19:07:12
【问题描述】:

我试图在查询时提供分析器,但它不起作用。

  1. 创建索引

PUT 客户

  1. 关闭索引,然后使用分析器配置和打开索引更新索引设置

PUT customer_new/_settings

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
                        "digit"
          ]
        }
      }
    }
  }
}
  1. 数据查询

获取客户/_搜索

{
  "query": {
    "match": {
     "phonenumber": { "query":"678",
     "analyzer": "my_analyzer"
     }
    }
  }
}

但这不会返回任何结果。

  1. 关于解释查询

POST customer/_validate/query?explain

{
  "query": {
    "match": {
     "phonenumber": { "query":"678",
     "analyzer": "my_analyzer"
     }
    }
  }
}

{
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "valid": true,
    "explanations": [
        {
            "index": "customer",
            "valid": true,
            "explanation": "phonenumber:678"
        }
    ]
}

我更新索引的原因是我已经有了索引。我想要做的是我可以接收不同的方式来搜索一个字段,所以我想动态添加分析器,然后在查询时使用它们。

我想如果我通过更新映射重新索引并在 phonenumber 字段中配置此分析器,这将起作用。但是就像我上面提到的那样,我不想重新索引,因为有数百万条记录,并且经常重新索引不是一种选择。

有没有办法解决这个问题?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    简答:您必须重新索引您的文档

    当您在查询中指定分析器时,查询中的文本将使用此分析器,而不是文档中的字段

    例如,如果您使用默认分析器索引“Hello”并使用不带小写的分析器搜索“Hello”,您将不会得到结果,因为您将尝试将“Hello”与“hello”(即小写)匹配.

    应用新映射的唯一解决方案是重新索引文档。您不能只对映射发生变化的字段重新编制索引。

    这可能不是您正在寻找的解决方案,但这里有一些提示来解决这个问题:

    • 如果您使用 ngram 分析器在术语内进行搜索,您可以使用 wildcard query*<SEARCH_TERM>*234 将匹配 12345。您不必创建新的分析器,因为您只需更改查询。请注意,它会带来重要的查询开销。

    • 无需重新索引整个索引,只需创建文档子集即可。这可以通过_reindex 端点轻松完成。仅使用此子集测试和改进您的映射,一旦您对结果满意,重新索引所有文档。

    • 如果您还没有使用它们,请使用 alias 使重新索引对应用程序透明。

    【讨论】:

    • 使用通配符查询成本很高,需要谨慎实施,并且正如 OP 已经提到的索引中有数百万条记录,因此使用通配符查询会严重影响性能。
    • 100% 同意你的看法。这只是没有重新索引的唯一方法,这就是我提到它的原因。我通常建议不要使用通配符。
    • 在这种情况下,我也想不出别的办法,很好的解释,点赞
    • 我在映射中使用 edge_gram 分析器,但想要搜索文档单词而不是通配符基本。如何在不改变映射的情况下实现它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多