搜索名称列表并对每个字母类型进行分类

时间:2017-05-12 00:11:14

标签: elasticsearch

我想使用ES索引大量名称。 我想区分每个单词中的辅音和元音,并能够根据每个字母的位置进行搜索,如果它是辅音或元音。

所以说出这样的名字:

JOHN

我想输入:

CVCC

当我运行搜索时,JOHN应该在结果集中。

有可能以某种方式在弹性搜索中对名称进行索引,以便我可以使用标记C和V对元音进行索引然后搜索它们吗?

所以Elasticsearch必须为每个单词的每个位置索引字符类型,如何做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以使用自定义分析器中的pattern_replace字符过滤器来完成此操作。此外,在我的解决方案中,我使用了自定义分析器的子字段,可能会想要在名称字段上进行其他类型的搜索,辅音 - 元音只是其中之一。

DELETE test
PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "replace_filter_lowercase_CONS",
            "replace_filter_uppercase_CONS",
            "replace_filter_lowercase_VOW",
            "replace_filter_uppercase_VOW"
          ]
        }
      },
      "char_filter": {
        "replace_filter_lowercase_CONS": {
          "type": "pattern_replace",
          "pattern": "[b-df-hj-np-tv-z]{1}",
          "replacement": "c"
        },
        "replace_filter_uppercase_CONS": {
          "type": "pattern_replace",
          "pattern": "[B-DF-HJ-NP-TV-Z]{1}",
          "replacement": "C"
        },
        "replace_filter_lowercase_VOW": {
          "type": "pattern_replace",
          "pattern": "[aeiou]{1}",
          "replacement": "v"
        },
        "replace_filter_uppercase_VOW": {
          "type": "pattern_replace",
          "pattern": "[AEIOU]{1}",
          "replacement": "V"
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "cons_vow": {
              "type": "text",
              "analyzer": "my_analyzer"
            }
          }
        }
      }
    }
  }
}

POST /test/test/1
{"name":"JOHN"}
POST /test/test/2
{"name":"Andrew"}
POST /test/test/3
{"name":"JOhn DOE"}

GET /test/_search
{
  "query": {
    "term": {
      "name.cons_vow": {
        "value": "CVCC"
      }
    }
  }
}