弹性搜索与字段中的 space 最接近的匹配项

Elastic Search Closest match with space in fields

我在包含 “面罩” 的 elasticsearch 字段中有数据,我可以通过以下查询获取此数据并将 search_term 设置为“面孔” , "面罩", "面具" 和 "面罩"。

{
    "query": {
        "bool": {
            "must": [{
                "multi_match": {
                    "query": ${search_term},
                    "fields": [
                        "title^4",
                        "titleNgram^3",
                    ],
                    "fuzziness": "auto"
                }
            }]
        }
    }
}

我无法实现的是,当我查询 "facemask"(search_term 中没有空格)时,它没有 return 任何文档包含 “face”“mask”,但是,returns 文档的字段包含 “facewash” 。有办法实现吗?

映射分享如下

{
    "mappings": {
        "_doc": {
            "properties": {
                "title": {
                    "type": "text"
                },
                "titleNgram": {
                    "search_analyzer": "whitespace_analyzer",
                    "analyzer": "nGram_analyzer",
                    "type": "text"
                },
                "id": {
                    "index": false,
                    "type": "text"
                }
            }
        }
    }
}

您可以尝试删除 "search_analyzer": "whitespace_analyzer", 并重新索引数据并使用相同的查询,它应该 return 您会得到预期的结果。

{
    "mappings": {
        "_doc": {
            "properties": {
                "title": {
                    "type": "text"
                },
                "titleNgram": {
                    "search_analyzer": "whitespace_analyzer", --> remove this line.
                    "analyzer": "nGram_analyzer",
                    "type": "text"
                },
                "id": {
                    "index": false,
                    "type": "text"
                }
            }
        }
    }
}

编辑:我在本地测试过它对我有用,下面是我使用的示例

搜索查询

{
  "query": {
    "multi_match": {
      "query": "face mask",
      "fields": [
        "titlengram",
        "title"
      ]
    }
  }
}

 

它给出了你期望的文档

 "hits": [
      {
        "_index": "ngram",
        "_type": "_doc",
        "_id": "1",
        "_score": 2.3014567,
        "_source": {
          "title": "face mask",
          "titlengram": "face mask"
        }
      }