Elasticsearch:如何使用不同的分析仪进行搜索?

时间:2013-05-17 10:11:59

标签: elasticsearch tire

我正在使用我的自定义分析器autocomplete_analyzer和过滤器edgeNGram。所以映射看起来像:

  "acts_as_taggable_on_tags" : {
    "acts_as_taggable_on/tag" : {
      "properties" : {
        "name" : {
          "type" : "string",
          "boost" : 10.0,
          "analyzer" : "autocomplete_analyzer"
        }
      }
    }
  }

当我使用query_string进行搜索时,它就像自动完成一样。例如,查询“lon”返回[“lon”,“long”,“london”,...]。

但有时我需要完全匹配。我怎样才能得到一个完全匹配的单词“lon”?我可以在进行搜索查询时使用其他分析工具(例如simplestandard)吗?

1 个答案:

答案 0 :(得分:2)

我认为您需要将数据存储在2个单独的字段中。一个包含执行自动完成查询所需的标记,另一个包含完整搜索查询。

如果您只有一个带有令牌[lon, lond, londo, london]的字段,那么如果您搜索此字段,则无法说“请仅匹配令牌london,因为这是完整的字/最长令牌”。

使用多字段可以很好地为您完成2个字段。看看the elasticsearch docs on multi-field。这部分的“官方”文档相当不错,请查看!

我可能会这样做:

映射

"acts_as_taggable_on_tags" : {
  "acts_as_taggable_on/tag" : {
    "properties" : {
      "name" : {
        "type" : "multi_field",           
        "fields" : {
          "name" : {
            "type" : "string",
            "boost" : 10.0
          },
          "autocomplete" : {
            "type" : "string",
            "analyzer" : "autocomplete_analyzer",
            "boost" : 10.0
          }
        }
      }
    }
  }
}

查询

用于自动填充查询:

"query": {
  "query_string": {
    "query" : "lon",
    "default_field": "name.autocomplete"
  }
}

正常查询:

"query": {
  "query_string": {
    "query" : "lon",
    "default_field": "name"
  }
}

注意“default_field”的区别。

给出的另一个答案是行不通的;不同的search_analyzer意味着搜索“伦敦”不会被标记为lon, lond, londo, london但是这不会阻止搜索'lon'来匹配名称为'london'的文档,我认为这就是你想要的。