弹性搜索中的术语+模糊性

时间:2018-12-10 11:12:56

标签: elasticsearch

是否可以将模糊与词条查询一起使用而不匹配? 让我解释一下:

假设我们有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"}

但是我只想要带有模糊的结果,该结果对应于模糊度= 1的“精确” match(“ term”)

1 个答案:

答案 0 :(得分:0)

每次进行精确匹配时,您都需要输入Keyword类型的字段,因为与Text类型不同,它不会进入Analysis阶段

我已经在示例映射下面创建了一个示例映射,其中字段myfield是一个multi-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
            }
          }
        }
      ]
    }
  }
}

希望这会有所帮助。