search - ElasticSearch问题与匹配结果

标签 search elasticsearch match matching n-gram

我在查询数据库中是否存在“ford”时遇到问题,并且搜索“fordddddddd”时会返回匹配项。我有ngram可以对诸如“fo”,“for”,“ford”之类的查询进行部分匹配,但“fordddddd”不应该匹配。可能是什么问题?以下是我的设置,映射和查询。

设定:

  settings: {
    number_of_shards: 1,
    analysis: {
      filter: {
        ngram_filter: {
          type: 'edge_ngram',
          min_gram: 2,
          max_gram: 15
        }
      },
      analyzer: {
        ngram_analyzer: {
          type: 'custom',
          tokenizer: 'standard',
          filter: [
            'lowercase',
            'ngram_filter'
          ]
        }
      }
    }
  }

对应:
  mappings: [
    {
      name: 'car',
      _all: {
        type: 'string',
        analyzer: 'ngram_analyzer'
      },
      properties: {
        description: {
          properties: {
            name: {
              type: 'string',
              include_in_all: true,
              term_vector: 'yes',
              analyzer: 'ngram_analyzer'
            },
            model: {
              type: 'string',
              include_in_all: true,
              term_vector: 'yes',
              analyzer: 'ngram_analyzer'
            }
          }
        }        
      }
    }
  ]

查询:
GET car/_search
{
    "query": {
        "match": {
           "_all": {
               "query": "Forddddddd"
           }
        }
    }
}

最佳答案

这里的问题是,您为analyzerindexing使用相同的searching

当您搜索Forddddd时,会应用ngram_analyzer并生成fo,for,for的 token ,因此它为您提供结果,您应指定standard analyzer进行搜索,您将获得所需的结果。

properties: {
    name: {
        type: 'string',
        include_in_all: true,
        term_vector: 'yes',
        analyzer: 'ngram_analyzer',
        search_analyzer: 'standard' <--- here
    },
    model: {
        type: 'string',
        include_in_all: true,
        term_vector: 'yes',
        analyzer: 'ngram_analyzer',
        search_analyzer: 'standard' <--- here
    }
}

关于search - ElasticSearch问题与匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346624/

相关文章:

full-text-search - Solr:如何在文本字段上搜索完整匹配项?是否有隐藏的 equal() 运算符?

Javascript 正则表达式匹配

java - 如何使用elasticsearch api高效地对大量数据进行搜索?

MySQL 在列搜索中选择

java - 在 java 中,如何在另一个字符串数组中搜索字符串数组?

java - 通过 JAVA API 使用 JSON 文件查询 ElasticSearch

php - Elasticsearch查询构造中的if else语句

elasticsearch - ElasticSearch的文档远远少于我添加的文档

mysql - 使用 Ruby 和 MySQL 进行多词搜索

MySQL MATCH 具有多个关键字