_sourceからデータを消しておく

クエリー時に_sourceに含めないという設定もあるけど、インデックス時に_sourceに入れないでおくという方法もある。Fess 13ではこの機能を使ってハイブリットな言語用インデックスで検索する予定ではある。

で、使うためにはElasticsearchのサイトにもあるような感じで

$ curl -X PUT "localhost:9200/fess" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc": {
"_source": {
"excludes": [
"content_*",
"title_*"
]
}
}
}
}
'

のようにすれば、title_〜とcontent_〜のプロパティは_sourceに保存されなくなる。

でも、Fessではcontent_lengthは除外したくないので、

$ curl -X PUT "localhost:9200/fess" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc": {
"_source": {
"includes": [
"content_length"
],
"excludes": [
"content_*",
"title_*"
]
}
}
}
}
'

としたところ、全部が消えることになり、期待する動きとは違っていた…。つまり、includes > excludesの順に処理するっぽい。というわけで、Fessではexcludesにワイルドカードを使わずに明示して対応した。

cluster.routing.use_adaptive_replica_selection

Elasticsearch 6までは複数のレプリカがある場合、レプリカの使われ方はラウンドロビンで順番に使われます。たとえば、
・シャード1P, シャード1R1 シャード1R2
・シャード2P, シャード2R1 シャード2R2
のように2シャードの3レプリカの場合は、1回目の検索で1P&2P, 2回めの検索で1R1&2R1, 3回目の検索で1R2&2R2みたいな感じで使われることになります(実際には非同期で処理されるのでシャード1と2ではそのときのが選択されて場合によってはPとRはずれる気はするけど)。という感じで、デフォルトはラウンドロビンということ。

Elasticsearch 7からはラウンドロビンでなくなり、それを6でも試すなら、cluster.routing.use_adaptive_replica_selectionをtrueにする。7ではtrueになっている。

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"transient": {
"cluster.routing.use_adaptive_replica_selection": true
}
}
'

Types cannot be provided in get mapping requests, unless include_type_name is set to true.

Elasticsearch 7になると、typeを指定していると怒られる。たとえば、

$ curl "http://localhost:9201/fess.20190224/_mapping/_doc?pretty"
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "Types cannot be provided in get mapping requests, unless include_type_name is set to true."
}
],
"type" : "illegal_argument_exception",
"reason" : "Types cannot be provided in get mapping requests, unless include_type_name is set to true."
},
"status" : 400
}

という感じで、Mapping APIで…/_mapping/{type} みたいなことしているとエラーになる。とりあえず、回避したいのであれば、

$ curl "http://localhost:9201/fess.20190224/_mapping/_doc?include_type_name=true&pretty"

とすれば、今までどおりに返ってくる。まぁ、本来はtypeを指定しないようにするようになおすのが良いが、URLからtypeを消すだけでなく、レスポンスの中のtypeもなくなるので、レスポンスをパースしている仕組みも合わせて修正する必要がある。