当前位置: 首页 > 知识库问答 >
问题:

弹性搜索中的edge_ngram标记器问题

宋斌
2023-03-14

我正在使用edge ngram标记器来提供部分匹配。我的文件看起来像

Name
Labson series LTD 2014
Labson PLO LTD 2014A
Labson PLO LTD 2014-I
Labson PLO LTD. 2014-II

我的映射如下

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 40,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "string",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}

PUT my_index/doc/1
{
  "title": "Labson Series LTD 2014" 
}

PUT my_index/doc/2
{
  "title": "Labson PLO LTD 2014A" 
}


PUT my_index/doc/3
{
  "title": "Labson PLO LTD 2014-I" 
}


PUT my_index/doc/4
{
  "title": "Labson PLO LTD. 2014-II" 
}

以下查询给了我3个正确的文档(Labson PLO LTD 2014ALabson PLO LTD 2014-ILabson PLO LTD.2014-II

GET my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "labson plo", 
        "operator": "and"
      }
    }
  }
}

但是当我输入Labson PLO 2014A时,它会给我0个文档

GET my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Labson PLO 2014A", 
        "operator": "and"
      }
    }
  }
}

我希望这将返回1个文档Labson PLO LTD 2014A,但出于某种原因,它似乎没有索引令牌中的数字。让我知道,如果我错过了什么东西在这里。

共有1个答案

伯向晨
2023-03-14

在您的autocomplete\u搜索中使用的是lowercasetokinzer。它同时执行字母标记器小写标记过滤器的功能。

https://www.elastic.co/guide/en/elasticsearch/reference/2.3//analysis-lowercase-tokenizer.html

现在让我们看看字母标记器的作用。

每当遇到非字母字符时,字母标记器就会将文本分解为术语。

https://www.elastic.co/guide/en/elasticsearch/reference/master/analysis-letter-tokenizer.html

所以在你的情况下,当你询问。

“查询”:“Labson PLO 2014A”,

这个查询实际上变成了

“标题:拉布森标题:巴解组织标题:a”

自2014年字母标记器下降以来。现在,索引标记不包含仅包含字母a的标记。这就是你没有得到任何结果的原因。

你可以在kibana中这样分析你的查询

POST my_index/_validate/query?explain
{
  "query": {
    "match": {
      "title": {
        "query": "Labson PLO 2014a", 
        "operator": "and"
      }
    }
  }
}

你会看到2014年正在下降。从最后的查询。

还要查看字母标记器生成的内容,请使用以下查询

POST _analyze
{
  "tokenizer": "letter",
  "text": "Labson PLO LTD 2014a"
}

 类似资料:
  • 我使用ElasticSearch对数据库进行索引。我试图使用edgeNGram标记器切割字符串,以射出要求“新字符串必须长于4个字符”的字符串。我使用以下代码创建索引: 现在我运行test来查看结果 并得到结果

  • 最大ngram 36 在速度和内存方面,这会得到真正糟糕的加班吗?有没有更好的方法来部分搜索UUID?例如,我有7e222584-0818-49b0-875b-2774f4bf939b,我希望能够使用9b0搜索它

  • 基数聚合计算不同值的近似计数。但是,为什么即使对于存储在单个碎片中的索引,它也显示不正确的值呢?

  • 这是我的结果源看起来的样子。 {“script”:{“inline”:“ctx._source.name='Where's My Crown”“,”lang“:”painless“},”query“:{”match“:{”movie_id“:69}}} 但我有一个错误: {“type”:“illegal_argument_exception”,“reason”:“意外标记['s']应为[{,‘;’

  • 我已经将弹性搜索1.7.1与spring应用程序集成在一起。我有一个cron作业,它在每次运行时更新弹性搜索的索引。我遵循了github上的各种示例代码来使其工作。首先,我为索引目的自动连接了ElasticSearchOperations: 然后以以下方式执行内部循环索引 当我第一次运行它时,它就像预期的那样工作。我已经在config文件夹中的elasticsearch.yml中将cluster重

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢