如何在弹性搜索中将术语与空格匹配?

时间:2015-04-17 07:41:24

标签: elasticsearch match spaces

我有一个在elasticsearch中编入索引的内容字段(字符串)。分析仪是默认的单标准分析仪。

当我使用匹配查询进行搜索时:

{"query":{"match":{"content":"micro soft", "operator":"and"}}}

结果显示它无法匹配" microsoft"。

然后如何使用输入关键字" micro soft"匹配文档内容包含" microsoft"?

3 个答案:

答案 0 :(得分:1)

另一种解决方案是使用 nGram 令牌过滤器,它可以让你有更多的模糊"匹配。

将您的示例用于" microsoft"和"微软",这是一个如何的例子 ngram标记过滤器会分解标记:

POST /test
{
  "settings": {
    "analysis": {
      "filter": {
        "my_ngrams": {
          "type": "ngram",
          "min_gram": "3",
          "max_gram": "5"
        }
      },
      "analyzer" : {
        "my_analyzer" : {
          "type" : "custom",
          "tokenizer" : "standard",
          "filter": ["my_ngrams"]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "body": {
          "type": "string",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}

分析这两件事:

curl '0:9200/test/_analyze?field=body&pretty' -d'microsoft'
{
  "tokens" : [ {
    "token" : "mic"
  }, {
    "token" : "micr"
  }, {
    "token" : "micro"
  }, {
    "token" : "icr"
  }, {
    "token" : "icro"
  }, {
    "token" : "icros"
  }, {
    "token" : "cro"
  }, {
    "token" : "cros"
  }, {
    "token" : "croso"
  }, {
    "token" : "ros"
  }, {
    "token" : "roso"
  }, {
    "token" : "rosof"
  }, {
    "token" : "oso"
  }, {
    "token" : "osof"
  }, {
    "token" : "osoft"
  }, {
    "token" : "sof"
  }, {
    "token" : "soft"
  }, {
    "token" : "oft"
  } ]
}

curl '0:9200/test/_analyze?field=body&pretty' -d'micro soft'
{
  "tokens" : [ {
    "token" : "mic"
  }, {
    "token" : "micr"
  }, {
    "token" : "micro"
  }, {
    "token" : "icr"
  }, {
    "token" : "icro"
  }, {
    "token" : "cro"
  }, {
    "token" : "sof"
  }, {
    "token" : "soft"
  }, {
    "token" : "oft"
  } ]
}

(我在这里删掉了一些输出,完整输出: https://gist.github.com/dakrone/10abb4a0cfe8ce8636ad

正如您所看到的,因为" microsoft"和"微软"交叠, 你可以找到这样的搜索匹配。

答案 1 :(得分:1)

解决此问题的另一种方法是进行单词分解,您可以使用基于字典的方法:Compound Word Token Filter或使用以算法方式分解单词的插件:Decompound plugin

单词microsoft会例如被分成以下标记:

{
   "tokens": [
      {
         "token": "microsoft",
      },
      {
         "token": "micro",
      },
      {
         "token": "soft",
      }
   ]
}

此令牌将允许您搜索您提出的部分字词。

与其他答案中提到的ngrams方法相比,这种方法可以获得更高的精确度,只有略低的召回率。

答案 2 :(得分:0)

尝试以下ES wilcard

 { 
 "query" : { 
     "bool" : { 
         "must" : { 
             "wildcard" : { "content":"micro*soft" } 
         } 
     } 
 }

}