使用边缘NGrams进行索引以进行预先输入

时间:2013-01-04 19:20:59

标签: lucene elasticsearch

我正在尝试让Elasticsearch为一些文档编制索引以获取预先建议。据我所知,Elasticsearch中的边缘NGram处理由Lucene提供。不幸的是,Lucene在这方面的文档证明对我来说很难理解。我提出的最好的是基于https://gist.github.com/988923,但它似乎不起作用(具有这些设置的索引仅返回完整单词的匹配,就好像设置不存在一样):

{
  "settings":{
    "index":{
      "analysis":{
        "analyzer":{
          "typeahead_analyzer":{
            "type":"custom",
            "tokenizer":"edgeNGram",
            "filter":["typeahead_ngram"]
          }
        },
        "filter":{
          "typeahead_ngram":{
            "type":"edgeNGram",
            "min_gram":1,
            "max_gram":8,
            "side":"front"
          }
        }
      }
    }
  }
}

我真的根本不知道分析仪,标记器和滤波器是如何组合在一起的 - 我是否还想要一个过滤器?我应该只有一个标记器吗?在索引要使用的文档时,是否必须引用这些设置?如何找出Lucene下面用于给定索引的设置?我该如何调试?帮助: - )

1 个答案:

答案 0 :(得分:1)

我使用edgeNGram解决了这个问题。下面是我用来实现这一目标的映射和分析。

{
"analysis": {
    "analyzer": {
        "str_search_analyzer": {
            "tokenizer": "standard",
            "filter": [
                "lowercase"
            ]
        },
        "str_index_analyzer": {
            "tokenizer": "standard",
            "filter": [
                "lowercase",
                "substring"
            ]
        }
    },
    "filter": {
        "substring": {
            "type": "edgeNGram",
            "min_gram": 1,
            "max_gram": 10,
            "side": "front"
        }
    }
}

}

{
"index_name": {
    "properties": {
        "location": {
            "type": "geo_point"
        },
        "name": {
            "type": "string",
            "index": "analyzed",
            "search_analyzer": "str_search_analyzer",
            "index_analyzer": "str_index_analyzer"
        }
    }
}

}

一个重要的注意事项是我需要使用与AND运算符匹配的查询来正确查询。

希望这有帮助。