匹配短语未提供预期结果的ElasticSearch n元语法标记器

fhity93d  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(1)|浏览(123)

我按如下方式创建了一个索引

PUT /ngram_tokenizer
{
  "mappings": {
    "properties": {
      "test_name": {
      "type": "text",
      "analyzer": "my_analyzer"
    }
  } 
},
  "settings": {
    "index": {
      "max_ngram_diff": 20
    },
    "analysis": {
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 20,
          "token_chars":[
            "letter",
            "digit",
            "whitespace",
            "symbol"
            ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      }
    }
  }
}

然后按如下方式进行索引

POST /ngram_tokenizer/_doc
{
  "test_name": "test document"
}
POST /ngram_tokenizer/_doc
{
  "test_name": "another document"
}

然后我执行了一个Match_Phrase查询,

GET /ngram_tokenizer/_search
{
  "query": {
    "match_phrase": {
      "test_name": "document"

  }
}
}

上面的查询按预期返回两个文档,但下面的查询没有返回任何文档

GET /ngram_tokenizer/_search
{
  "query": {
    "match_phrase": {
      "test_name": "test"

  }
}
}

此外,我还通过以下查询检查了它生成的所有令牌

POST ngram_tokenizer/_analyze
{
  "analyzer": "my_analyzer",
  "text": "test document"
}

匹配查询很好,你们能帮我吗

更新

当我想要搜索一个短语时,我必须执行Match_Phrase查询,对吗?然后,我在该字段上使用了n-gram标记器,因为,如果搜索词中有任何拼写错误,我仍然可以得到类似的文档。此外,我知道我们可以使用模糊性来克服搜索词中的打字错误问题。但当我在匹配查询或模糊查询中使用模糊性时,就会出现这里提到的得分问题。实际上,我想要的是,当我进行匹配查询时,我希望得到结果,即使搜索术语中有拼写错误。在Match_Phrase查询中,至少当我搜索时没有任何输入错误时,我应该会得到正确的结果。

bqucvtff

bqucvtff1#

这是因为在搜索时,用于分析输入文本的分析器与索引时使用的分析器相同,即my_analyzer,而match_phrase查询比match查询稍微复杂一些。

在搜索时,您只需使用standard分析器(或与ngram分析器不同的其他工具)来分析您的查询输入。

下面的查询显示了如何使其按照您的预期工作。

GET /ngram_tokenizer/_search
{
  "query": {
    "match_phrase": {
      "test_name": {
        "query": "test",
        "analyzer": "standard"
      }
    }
  }
}

您还可以在Map中将standard分析器指定为search_analyzer

"test_name": {
  "type": "text",
  "analyzer": "my_analyzer",
  "search_analyzer": "standard"
}

相关问题