Elasticsearch返回意外结果

时间:2017-06-13 08:15:57

标签: elasticsearch

我使用了以下映射: 我修改了英文分析器,使用ngram分析器如下,这样我就可以在以下场景下搜索: 1]部分搜索和特殊字符搜索 2]利用语言分析器

{
    "settings": {
        "analysis": {
            "analyzer": {
                "english_ngram": {
                    "type": "custom",
                    "filter": [
                        "english_possessive_stemmer",
                        "lowercase",
                        "english_stop",
                        "english_stemmer",
                        "ngram_filter"
                    ],
                    "tokenizer": "whitespace"
                }
            },
            "filter": {
                "english_stop": {
                    "type": "stop"
                },
                "english_stemmer": {
                    "type": "stemmer",
                    "language": "english"
                },
                "english_possessive_stemmer": {
                    "type": "stemmer",
                    "language": "possessive_english"
                },
                "ngram_filter": {
                    "type": "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 25
                }
            }
        }
    },
    "mappings": {
    "movie": {
      "properties": {
        "title": {
          "type": "string",
          "fields": {
            "en": {
              "type":     "string",
              "analyzer": "english_ngram"
            }
          }
        }
      }
    }
  }
}

将我的数据编入索引如下:

   PUT http://localhost:9200/movies/movie/1
    {
        "title" : "$peci@l movie"
    }

查询如下:

{
    "query": {
        "multi_match": {
            "query":    "$peci#44 m11ov",
            "fields": ["title.en"],
            "operator":"and",
            "type":     "most_fields",
            "minimum_should_match": "75%"
        }
    }
}

在查询中我正在寻找" $ peci#44 m11ov"字符串,理想情况下我不应该得到这个结果。 这里有什么问题吗?

1 个答案:

答案 0 :(得分:0)

这是ngram标记化的结果。当您对字符串$peci@l movie进行标记时,您的分析器会生成诸如$$p$pe等标记。您的查询也会生成大部分这些标记。虽然这些比赛的得分低于完全比赛。如果排除这些误报匹配至关重要,您可以尝试使用min_score选项https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-min-score.html

设置阈值