修复ElasticSearch/OpenSearch查询的future

zvokhttg  于 6个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(69)

我在尝试进行简单查询时遇到问题,请查看以下数据:
拥有这些数据:

POST test/_doc/1
{
  "id": 1,
  "title": "Test Name"
}

POST test/_doc/2
{
  "id": 2,
  "title": "TestName"
}

字符串
这个查询:

GET test/_search
{
  "query": {
    "match": {
      "title": {
        "query": "TestName",
        "fuzziness": "AUTO"
      }
    }
  }
}


使用此输出:

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.605183,
    "hits": [
      {
        "_index": "test",
        "_id": "2",
        "_score": 1.605183,
        "_source": {
          "id": 2,
          "title": "TestName"
        }
      }
    ]
  }
}


为什么输出不返回两条记录?
我该怎么补救?

js5cn81o

js5cn81o1#

Tldr;

Fizziness在elasticsearch中有限制。限制是Levenshtien距离,最大设置为2。
这意味着您将无法匹配任何超过2个编辑的内容。

去理解

POST 77491663/_doc/1
{
  "id": 1,
  "title": "Test Name"
}

POST 77491663/_doc/2
{
  "id": 2,
  "title": "TestName"
}

POST 77491663/_doc/3
{
  "id": 2,
  "title": "TestNa"
}

GET 77491663/_search
{
  "query": {
    "match": {
      "title": {
        "query": "TestName",
        "fuzziness": "2"
      }
    }
  }
}

字符串
应该给你给予

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0925692,
    "hits": [
      {
        "_index": "77491663",
        "_id": "2",
        "_score": 1.0925692,
        "_source": {
          "id": 2,
          "title": "TestName"
        }
      },
      {
        "_index": "77491663",
        "_id": "3",
        "_score": 0.7283795,
        "_source": {
          "id": 2,
          "title": "TestNa"
        }
      }
    ]
  }
}

修复

你可能想看看analyser capabilities
例如,如果你使用ngram,你可以让它工作。

yvt65v4c

yvt65v4c2#

如果您使用的是默认的elasticsearch analyzer,则Test Name值将被拆分并单独存储到inverted index中,这意味着当您使用TestName值进行搜索时,elasticsearch检查TestName是否匹配fuzzy Test级别,或者匹配Name而不是短语Test Name,这就是为什么您无法获得第一个文档

相关问题