「Pokemon」で検索しても「Pokémon」がヒットするようにしよう

2016-11-16
このエントリーをはてなブックマークに追加

ふと気がつくと前回ブログ書いたのが5か月前という有様。安心してください、生きてますよ。

éとか、英字の上につくダッシュみたいな記号、アクセント記号って呼び方してましたけどダイアクリティカルマークっていうのが正しいんですね。

日本語の場合あんまり気にしないけど、海外のブランド名にもダイアクリティカルマーク付いてるの多いですよね。

例えばelasticsearchの公式にサンプルとして置いてある英語のアナライザーだと「Pokémon」は「Pokemon」で検索してもヒットしません。Solrも同様です。

まあ同義語展開しておけば済むんですけど、大量にある商品名とかブランド名の同義語をメンテするのとか気が遠くなるのでそれは避けたい。

で、elasticsearchにはちゃんとフィルターが用意されていて、前述のアナライザーに追記するだけでOK。

"filter": [
  "english_possessive_stemmer",
  "lowercase",
  "english_stop",
  "english_keywords",
  "english_stemmer",
  "asciifolding"
]

順番は最後で平気なはず。たぶん。
これでちゃんとヒットするようになりましたとさ。

当たり前ですが、Solrにもちゃんと同様のフィルターが用意されてます。ありがたい。

ASCII文字の置換してるだけみたいだけど、他の文字列に影響与えないか要検証。怖い怖い。

elasticsearchでcopy_toを使ってみる

2015-11-01
このエントリーをはてなブックマークに追加

SolrでいうところのCopyField。全文検索で複数フィールドを束ねて検索したい時には便利です。フィールドごとにスコアブーストしたいとなると別の方法を取るしかないかな。

{
    "title": {
        "type": "string",
        "copy_to": "text"
    },
    "description": {
        "type": "string",
        "copy_to": "text"
    },
    "text": {
        "type": "string",
        "index": "analyzed",
        "analyzer": "text_ja"
    }
}

これでtextフィールドにクエリ投げればtitleかdescriptionのどちらかに適合するドキュメントが返ってくる。データ元になるtitleとかdescriptionはindexをfalseにしておけばインデックスサイズも小さくなる。elasticsearch1.7.3で動きました。