elasticsearch,sense,Search,elasticsearch,Sense" /> elasticsearch,sense,Search,elasticsearch,Sense" />

使用ngram的elasticsearch查询问题

使用ngram的elasticsearch查询问题,search,elasticsearch,sense,Search,elasticsearch,Sense,我的索引中有这些数据 如果您注意到在映射中im使用ngram从3个令牌到20个令牌 执行此查询时: GET /my_index/user/_search?search_type=dfs_query_then_fetch { "query": { "filtered": { "query":{ "multi_match":{ "query": "F", "fields": ["username","firstnam

我的索引中有这些数据

如果您注意到在映射中im使用ngram从3个令牌到20个令牌

执行此查询时:

GET /my_index/user/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "filtered": { 
      "query":{
        "multi_match":{
          "query": "F",
          "fields": ["username","firstname","middlename","lastname"],
          "analyzer": "custom_search_analyzer"
        }
      }
    }
  }
}
我应该得到我索引的8个文档,但我只得到6个,不包括两个名为Franz和Francis的文档。我希望有这两个,因为数据中包含了f。由于某种原因,它不起作用

当我执行:

GET /my_index/user/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "filtered": { 
      "query":{
        "multi_match":{
          "query": "Fran",
          "fields": ["username","firstname","middlename","lastname"],
          "analyzer": "custom_search_analyzer"
        }
      }
    }
  }
}
我得到那两份文件

如果我将ngram降低到1,我会得到所有文档,但我认为这会影响查询的性能

我错过了什么。提前谢谢


注意:所有示例都是用sense编码的,这是预期的,因为最小值被指定为3。这意味着自定义分析器生成的令牌的最小长度是3个代码点

因此,“弗兰兹·席尔瓦”的第一个标志是“Fra”。 因此,标记“F”与此文档不匹配

可以使用以下方法测试分析仪生成的令牌:

curl -Xget "http://<server>/index_name/_analyze?analyzer=custom_analyzer&text=Franz Silva"
curl-Xget”http:///index_name/_analyze?analyzer=custom_analyzer&text=Franz 席尔瓦“

另外请注意,由于上面指定的“custom_analyzer”没有指定“token_chars”,因此标记可以包含空格。

如果我将ngram大小从1更改为20,例如,它将显示更多数据,因为几乎所有文档中都会出现每一个字母,那么我可以构建哪些解决方案来解决这个问题?