【问题标题】:Elastic Search Closest match with space in fields弹性搜索与字段中的空间最接近的匹配
【发布时间】:2020-07-22 12:50:06
【问题描述】:

我在包含 “face mask” 的 elasticsearch 字段中有数据,我可以使用以下查询获取此数据,其中 search_term 设置为“face”、“face mask”、“mask”和“口罩”。

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

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

映射在下面共享

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

【问题讨论】:

  • 你也可以分享一下映射吗?
  • 添加有问题

标签: elasticsearch search fuzzy-search fuzzy


【解决方案1】:

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

{
    "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"
        }
      }
   

【讨论】:

  • 我的查询字符串是“facemask”,没有任何空格。它不适合我。我改变了映射,你能检查一下吗?
  • @yousufiqbal 我检查了我的facemask,它给了我搜索结果,如果没有搜索分析器,我看不到你更新的映射
  • 成功了,谢谢。我没有正确更新映射。
  • @yousufiqbal 很高兴它有帮助
  • 谢谢!我要买面膜,但分数比洗面奶要低,有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2014-03-24
  • 2011-04-24
相关资源
最近更新 更多