【问题标题】:ElasticSearch search for special characters with pattern analyzerElasticSearch 使用模式分析器搜索特殊字符
【发布时间】:2015-07-24 16:46:39
【问题描述】:

我目前正在使用自定义分析器,将标记器设置为模式(\W|_)+ 所以每个术语都只是字母,并拆分为任何非字母。例如,我有一个内容为[dbo].[Material_Get] 的文档和另一个内容为dbo.Another_Material_Get 的文档。我希望能够搜索“Material_Get”并在两个文档上都得到点击,但是如果我搜索“[Material_Get]”它仍然会点击dbo.Another_Material_Get,即使它没有括号。此外,如果我搜索“Material Get”(在引用的搜索中),我不应该得到任何点击,因为它们都没有那个短语。

我可以选择一个分析器/标记器,只要文件中的任何位置有输入字符串,即使它旁边还有其他东西,它也会找到它。例如,搜索“aterial_get”将在两者中匹配。是否可以做我的任何一种情况?

【问题讨论】:

    标签: elasticsearch tokenize query-analyzer


    【解决方案1】:

    根据您的解释,我得到的是您想要进行部分匹配,例如搜索“aterial_get”。

    为了满足您的所有要求,您需要将字段的映射更改为在分析器中包含ngram token filter,并且不删除特殊字符。样品分析仪可能看起来像

    {
      "settings":{
        "analysis":{
          "analyzer":{
            "partialmatch":{
              "type":"custom",
              "tokenizer":"keyword",
              "filter":[ "lowercase", "ngram" ] 
            }
          },
          "filter":{
            "ngram":{
              "type":"ngram",
              "min_gram":2,
              "max_gram":15
            }
          }
        }
      }
    }
    

    并在您的映射中为your_field 定义上面定义的分析器“部分匹配”。您可以根据需要更改min_grammax_gram 的值。

    使用此映射,您可以像下面那样进行正常的术语搜索

    {
        "term": {
            "your_field": "aterial_get"
        }
    }
    

    【讨论】:

    • 15 的 max_gram 基本上是说如果有部分搜索超过 15 就行不通了吗?还有一种简单的方法可以将其设置为所有字段的分析器吗?
    • 对于大量大型文档,搜索速度会有多慢?
    • max_gram of 15 表示生成的令牌最大长度为 15。因此搜索长度超过 15 将不起作用。您可以为所有字段设置相同的分析器,但不推荐。对于大文本,索引大小将显着增加,从而影响搜索性能。但这又取决于您拥有多少硬件以及拥有多少文件。毕竟它也是倒排索引中的标记。通常 ngram/edgengram 用于较小的字段进行自动完成类型搜索。
    • 我现在注意到的一个问题是,如果我有一个带有“Material_Get”的文档,而另一个只有“at”这个词,并且我搜索“aterial”,我会点击这两个文档不想。
    • 如果您使用的是term search,那么您将不会同时获得这两个文档。如果您执行query_string 类型搜索并且未定义搜索分析器,则输入将被分析为与您的字段(ngram)相同,因此将匹配两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多