Reactivesearchでのエラー集
以下の記事を参考にElastic CloudのインデックスをReactivesearch(Elasticsearch用のReactライブラリ)を使って検索可能にしようとしてハマった。
fieldがkeyword型
今回はKibanaやLogstashなどを使わずに、ScrapyでクローリングしてきたJSONデータを少し加工してElastic Cloudからアップロードしたらbody以外の型がkeyword型になっていた。
まずこの場合は普通に検索しようとするとすべてのデータが出たままとなりコンソールに以下エラーが表示される。
failed to create query: Can only use phrase prefix queries on text fields - not on [title] which is of type [keyword]"
そこでReactivesearch側のdetaFieldもkeyword側にしてやるとエラーは消える。
<DataSearch
componentId='searchbox'
dataField={[
{
field: 'author.keyword',
weight: 3,
},
{
field: 'author.autosuggest',
weight: 1,
},
{
field: 'title.keyword',
weight: 5,
},
{
field: 'title.autosuggest',
weight: 1,
},
{
field: 'body',
weight: 1,
}
]}
placeholder='Search for title or author or body'
/>
ReactiveListにdataFieldがない
またコンソールを見るとReactiveListはdataFieldプロパティが必須だよとのエラーが。
Failed prop type: The prop
dataField
is marked as required inReactiveList
, but its value isundefined
.
componentIdが「searchbox」である要素と同じdataFieldだよという意味らしく下記のように追記すればOK
<DataSearch
componentId='searchbox'
dataField={[
{
field: 'author.keyword',
weight: 3,
},
// 省略
{
field: 'body',
weight: 1,
}
]}
placeholder='Search for title or author or body'
/>
<SelectedFilters />
<ReactiveList
componentId='results'
size={6}
pagination={true}
dataField='searchbox' // 追記
react={{
and: ['searchbox'],
}}
render={({ data }) => (
<ReactiveList.ResultCardsWrapper>
// 省略
</ReactiveList.ResultCardsWrapper>
)}
/>
Vecelにデプロイした時に401エラーでなぜかインデックスのURLがappbase.ioを向いていた。これは環境変数が設定されていないときにデフォルトでappbase.io側のインデックスを向くようで、Vercelの環境変数を設定後にRedeployをしてもダメだったが、再度設定しなおしたり色々やってたら治った。キャッシュか?
POST https://scalr.api.appbase.io/your-index-name/_msearch? 401
{"type":"default","status":401,"ok":false,"statusText":"","headers":{"map":{"content-length":"75","content-type":"application/json"}},"url":"https://scalr.api.appbase.io/your-index-name/_msearch?","_bodyInit":{},"_bodyBlob":{},"bodyUsed":true}
ちなみに環境変数はダブルクォーテーションあってもなくても変わらないようで(改行が多いとないとエラーになったような記憶が)、またRedeploy時に「Inculude Build Cache」はオフにしといた。オンにすると環境変数などVercel側の設定だけを反映し、コード自体はキャッシュしてあるビルド済みファイルを再利用するようだ。たぶん。