为什么 Elasticsearch 在搜索过程中不使用分析器令牌?

问题描述 投票:0回答:1

index/_analyze

{
  "analyzer": "autocomplete",
  "field": "name",
  "text": "жаб"
  
}

给了我正确的标记:

{
    "tokens": [{
        "token": "žab",
        "start_offset": 0,
        "end_offset": 3,
        "type": "<ALPHANUM>",
        "position": 0
    }]
}

现在,当我将令牌

žab
插入搜索时,它可以工作,它给了我结果。

解释查询:

index/_validate/query?explain

{
  "query": {
    "match": {
      "name": "жаб"
    }
  }
}

给我

{
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "valid": true,
    "explanations": [
        {
            "index": "places_for_search",
            "valid": true,
            "explanation": "name:žab"
        }
    ]
}

所以它被转换成

žab

但是当我有

{
  "query": {
    "match": {
      "name": "жаб"
    }
  }
}

它没有给我任何结果,但它应该,因为

žab
给了我结果。 我什至尝试像这样强制分析器:

{
  "query": {
    "multi_match": {
      "query": "жаб",
      "type": "bool_prefix",
      "fields": [
        "name"
      ],
      "analyzer": "autocomplete"
    }
  }
}

但仍然没有结果。

只是为了论证,我的文档如下所示:

{
   "id": "ChIJT3DV8zM5TRMRlVS4y79AH7A",
    "name": "Žabljak"
}

字段

name
具有自动完成分析器:

{
    "type": "search_as_you_type",
     "doc_values": false,
     "max_shingle_size": 3,
     "analyzer": "autocomplete",
     "search_analyzer": "autocomplete"
}

所以底线是,分析器可以工作,但不知何故,它没有在查询中使用,至少没有在查询结果中使用。知道如何进一步调试吗?

c# elasticsearch nest
1个回答
0
投票

Elasticsearch 使用分析器进行搜索和索引。 根据您分享的示例,由于您的分析器

жаб
在索引期间转换为
žab
。这当然也适用于搜索过程。当您搜索
жаб
时,它将在索引数据中搜索
žab

查看以下

_analyze
API调用结果。

POST _analyze
{
  "analyzer": "autocomplete",
  "text": "Žabljak"
}

您是否在回复中看到

žab
"token": "žab"
?如果不是就无法匹配...

让我们调试一下:

  • _analyze
    原始数据搜索模式
  • žab
    不等于
    Žab
    如果需要,请使用 小写 tokenfilter
  • ngram 或 edge_ngram 分词器可以帮助将
    Žabljak
    分词为 =>
    žab
    ,
    abl
    ,
    blj
    ...
© www.soinside.com 2019 - 2024. All rights reserved.