【问题标题】:Term+Fuzziness in elasticsearch弹性搜索中的术语+模糊性
【发布时间】:2018-12-10 11:12:56
【问题描述】:

是否可以对术语查询使用模糊而不匹配? 让我解释一下:

假设我们有 4 个文档

{ "index": { "_id": 1 }}
{ "text": "I play football!"}

{ "index": { "_id": 2 }}
{ "text": "I love playing"}

{ "index": { "_id": 3 }}
{ "text": "X is the best player"}

{ "index": { "_id": 4 }}
{ "text": "plyaer"}

使用时:

GET /index/my_type/_search
{

"query": {
    "fuzzy": {
      "value": "player",
      "fuzziness": 1 
    }
  }
}

我明白了:

{ "index": { "_id": 3 }}
{ "text": "X is the best player"}

{ "index": { "_id": 4 }}
{ "text": "plyaer"}

但我只想要一个 plyaer 的结果,它对应于 fuzziness=1 的“精确”匹配(“术语”)

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    每当您进行完全匹配时,您都需要拥有Keyword 类型的字段,因为与Text 类型不同,它不会经历Analysis 阶段

    我创建了下面的示例映射,其中字段myfieldmulti-field,如下图所示。

    映射

    {  
       "myfield":{  
          "type":"text",
          "fields":{  
             "keyword":{  
                "type":"keyword",
                "ignore_above":256
             }
          }
       }
    }
    

    然后您可以对keyword 类型的字段执行模糊搜索,而不是text 类型。

    myfield.keyword 上的模糊查询

    POST <your_index_name>/_search
    {
      "query": {
        "fuzzy": {
          "myfield.keyword": {
            "value": "player",
            "fuzziness": 2
          }
        }
      }
    }
    

    或者,您可以为这两种类型构建模糊查询,关键字类型具有更高的提升,这样完全匹配的结果就会出现在顶部。

    POST <your_index_name>/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "fuzzy": {
                "myfield.keyword": {
                  "value": "player",
                  "fuzziness": 2,
                  "boost": 10
                }
              }
            },
            {
              "fuzzy": {
                "myfield": {
                  "value": "player",
                  "fuzziness": 2,
                  "boost": 2
                }
              }
            }
          ]
        }
      }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我可以在将我的 csv 文件上传到 elasticsearch 后进行映射吗?
    • 如果您还没有自己创建映射,Elasticsearch 默认会创建我在映射中提到的内容。将为分类为字符串的每个字段创建一个 textkeyword 孪生。如果您已经明确创建了映射,那么恐怕您需要删除现有索引,与映射一起创建索引并再次插入文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多