Fuzzy包含使用elasticSearch的查询

时间:2016-11-10 13:48:38

标签: elasticsearch fuzzy-search n-gram elasticsearch-2.0 nosql

如何执行模糊并包含字符串的查询? 假设我有以下文件:

{ ... "name":"william shakespeare" ... }

我希望收到以下查询的文件:

  1. “威廉”(将返回所有威廉姆斯)
  2. “Willeam”(与1相同)
  3. “William Shake”(仅返回包含“William Shake”的文档
  4. “Wiliam缘故”(与3相同)
  5. “威廉·莎士比亚”/“威廉·莎士比亚”/“威廉·莎士比亚”(将只返回威廉·莎士比亚
  6. 我尝试使用ngram分析器和模糊查询但没有成功。

    {
      "settings": {
        "analysis": {
          "filter": {
            "ngram_analyzer_filter": {
              "type": "ngram",
              "min_gram": 2,
              "max_gram": 15
            }
          },
          "analyzer": {
            "ngram_analyzer": {
              "type": "custom",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "ngram_analyzer_filter"
              ]
            }
          }
        }
      },
      "mappings": {
        "my_type": {
          "properties": {
            "name": {
              "type": "string",
              "analyzer": "ngram_analyzer",
              "search_analyzer": "standard",
              "fields": {
                "raw": {
                  "type": "string",
                  "index": "not_analyzed"
                }
              }
            }
          }
        }
      }
    }
    

    我的疑问:

    {
      "query": {
        "multi_match": {
          "query": "william shake",
          "fields": [
            "name.raw"
          ],
          "fuzziness": 2,
          "minimum_should_match":2
        }
      }
    }
    
    • 它是multi_match,因为我搜索了多个字段。
    • 尝试使用分析的字段或not_analyzed字段。
    • 试图使用“type”:“phrase”
    • 弹性版本2.3.1

1 个答案:

答案 0 :(得分:0)

尝试以下查询。

{
  'query': {
    'multi_match': {
      'fields':  [ 
          "name.raw" 
        ],
        'query': $scope.search.queryTerm,
        'fuzziness': 2,
        'prefix_length': 1
    }
  }
}