「Elasticsearchのマスター:パワフルな検索と正確性のための初心者ガイドーPart 1」

「エラスティックサーチの達人:初心者のためのパワフルな検索と正確性ガイドーPart 1」

目次

イントロダクション・ 前回終わったところから始める、Elasticsearch ∘ サンプルデータセットElasticSearchのクエリの理解応答の理解基本的な検索クエリレキシカル検索現在の検索クエリの問題点似た言葉が異なる結果を返すユーザーの求める内容の理解が足りない似た言葉が返されないタイポは無視される単語の組み合わせによって異なる意味を持つ検索の改善より関連性の高いフィールドを強化する関数に基づいて強化するファジークエリ結論

イントロダクション

オンラインで完璧な靴を簡単に見つけたり、ソーシャルメディアの広大な世界で友人の投稿に偶然出くわすことはありませんか?それは、デジタル体験の無名のヒーローである検索システムのおかげです。

最新のオンライン購入を思い出してみてください – おしゃれな靴や友人への思いやりのある本など。あなたがまさに求めていたものに偶然出くわしたのはどうしてでしょうか?たぶん、検索バーを使ってさまざまな選択肢の中をナビゲートしたのです!それが検索システムの魔法であり、デジタルな通路の中で完璧な商品を見つけるのが非常に簡単になります。選択肢が豊富な世界で、私たちが迅速かつ効率的に求めるものを見つける能力は、私たちが愛する商品のために堅牢で直感的な検索システムの重要性を示しています。

最近のElasticsearchの探求(アーキテクチャと用語のプライマーをチェックしてください)では、これらの発見を支えるエンジンを明らかにしました。この記事では、検索について探求し、ElasticSearchのクエリのナビゲーション、レスポンスの理解、そしてステージを設定するための基本クエリの作成について説明します。

私たちの目標は、シンプルな検索クエリを作成し、問題点を見つけて実際の例で改善することです。現在の検索システムの課題に共感し、デジタル通路の世界で洗練された改善策を見つけるために私たちに参加してください。”

前回終わったところから始めましょう、ElasticSearch

サンプルデータセット

検索を改善するさまざまな方法をデモンストレーションするために、ElasticSearchをセットアップしてデータをロードしましょう。この投稿では、Kaggleで見つけたこのニュースデータセットを使用します。データセットは非常にシンプルで、約21万件のニュース記事と、その見出し、短い説明、著者、その他の興味のないフィールドが含まれています。全ての21万件のドキュメントは必要ありませんので、約1万件のドキュメントをESにロードして検索を開始します。

以下はデータセットのいくつかのドキュメントの例です。

[  {    "link": "https://www.huffpost.com/entry/new-york-city-board-of-elections-mess_n_60de223ee4b094dd26898361",    "headline": "Why New York City’s Board Of Elections Is A Mess",    "short_description": "「党派的な選挙管理委員会の根本的な問題があります」とニューヨークの選挙弁護士は述べました。",    "category": "POLITICS",    "authors": "Daniel Marans",    "country": "IN",    "timestamp": 1689878099  },  ....]

各ドキュメントはニュース記事を表しています。各記事にはlinkheadlineshort_descriptioncategoryauthorscountry(私が追加したランダムな値)、およびtimestamp(再び私が追加したランダムな値)が含まれています。

次のセクションの例をもっと楽しくするために、countryおよびtimestampフィールドを追加しましたので、始めましょう!

ElasticSearchクエリの理解

ElasticsearchのクエリはJSON形式で記述されます。検索クエリを作成するために使用できるさまざまな構文について詳しく深入りする代わりに、シンプルに始めてそれから構築していきましょう。

最もシンプルな全文検索クエリはmatchクエリです。アイデアは単純で、クエリを記述し、Elasticsearchが特定のフィールドに対して全文検索を実行することです。例えば、

GET news/_search{  "query": {    "match": {      "headline": "robbery"    }  }}

上記のクエリは、”headline”フィールドに「robbery」という単語が含まれるすべての記事を見つけます。私が戻ってきた結果は以下の通りです。

{  "_index" : "news",  "_id" : "RzrouIsBC1dvdsZHf2cP",  "_score" : 7.4066687,  "_source" : {    "link" : "https://www.huffpost.com/entry/guard-cat-hailed-as-hero_n_62e9a515e4b00f4cf2352a6f",    "headline" : "Bandit The 'Guard Cat' Hailed As Hero After Thwarting Would-Be Robbery",    "short_description" : "At least two people tried to break into a Tupelo, Mississippi, home last week, the cat did everything she could to alert its owner.",    "category" : "WEIRD NEWS",    "authors" : "",    "country" : "US",    "timestamp" : 1693070640  }},{  "_index" : "news",  "_id" : "WTrouIsBC1dvdsZHp2wd",  "_score" : 7.4066687,  "_source" : {    "link" : "https://www.huffpost.com/entry/san-francisco-news-crew-security-guard-shot-killed_n_61a2a9d8e4b0ae9a42af278a",    "headline" : "News Crew Security Guard Dies After Being Shot While Helping Robbery Coverage",    "short_description" : "Kevin Nishita was shot in the abdomen while doing his job amid an uptick in organized retail crime.",    "category" : "CRIME",    "authors" : "Daisy Nguyen, AP",    "country" : "US",    "timestamp" : 1692480894  }}

しかし、複数のフィールドで全文検索を行いたい場合はどうすればいいでしょうか?multi_matchクエリを使用することでそれが可能です。

GET news/_search{  "query": {    "multi_match": {      "query": "強盗",      "fields": ["見出し", "短い説明"]    }  }}

これは似たような操作を行いますが、単一のフィールドではなく、全ての文書の見出しと短い説明の両方を見て、全文検索を行います。

レスポンスの理解

これは前回のクエリからのサンプルレスポンスです。

{  "took" : 5,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 2,      "relation" : "eq"    },    "max_score" : 29.626675,    "hits" : [      {        "_index" : "news",        "_id" : "RzrouIsBC1dvdsZHf2cP",        "_score" : 29.626675,        "_source" : {          "link" : "https://www.huffpost.com/entry/guard-cat-hailed-as-hero_n_62e9a515e4b00f4cf2352a6f",          "headline" : "Bandit The 'Guard Cat' Hailed As Hero After Thwarting Would-Be Robbery",          "short_description" : "When at least two people tried to break into a Tupelo, Mississippi, home last week, the cat did everything she could to alert its owner.",          "category" : "WEIRD NEWS",          "authors" : "",          "country" : "US",          "timestamp" : 1693070640        }      },      .....    ]  }

tookフィールドとtimed_outフィールドは理解しやすいです。単にElasticsearchが応答を返すのにかかった時間(ミリ秒)と、クエリがタイムアウトしたかどうかを表します。

_shardsフィールドは、この検索操作に関与したシャードの数、成功したシャードの数、失敗したシャードの数、スキップされたシャードの数を示しています。

hitsフィールドには、検索から返された文書が含まれています。各文書には、検索との関連性に基づいてスコアが付けられています。hitsフィールドには、返されたドキュメントの総数と最大スコアも含まれています。

最後に、ネストされたフィールドhitsでは、関連するすべての文書が、その_idscoreとともに取得されます。ドキュメントはスコアによってソートされます。

基本的な検索クエリ

検索クエリの構築を始めましょう。シンプルなクエリから始め、問題点を解析できます。

GET news/_search{  "query": {    "multi_match": {      "query": "強盗",      "fields": ["見出し", "短い説明"]    }  }}

これは非常に単純なクエリで、指定されたフィールドのいずれかに単語「強盗」が現れるすべてのドキュメントを検索します。

いくつかの結果が返され、すべての結果に「強盗」という言葉が含まれていることがわかります。

{  .....  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : 8.164355,    "hits" : [      {        "_index" : "news",        "_id" : "hjrouIsBC1dvdsZHgWdm",        "_score" : 8.164355,        "_source" : {          "link" : "https://www.huffpost.com/entry/lady-gaga-dog-walker-reward_n_62d82efee4b000da23fafad7",          "headline" : "Lady Gagaのドッグウォーカー射殺事件の容疑者に対し$5Kの報奨金",          "short_description" : "暴力的な強盗に関与した男性の一人が4月に誤って釈放され、行方不明のままです。",          "category" : "U.S. NEWS",          "authors" : "STEFANIE DAZIO, AP",          "country" : "IN",          "timestamp" : 1694863246        }      },      {        "_index" : "news",        "_id" : "RzrouIsBC1dvdsZHf2cP",        "_score" : 7.4066687,        "_source" : {          "link" : "https://www.huffpost.com/entry/guard-cat-hailed-as-hero_n_62e9a515e4b00f4cf2352a6f",          "headline" : "Bandit The 'Guard Cat' Hailed As Hero After Thwarting Would-Be Robbery",          "short_description" : "When at least two people tried to break into a Tupelo, Mississippi, home last week, the cat did everything she could to alert its owner.",          "category" : "WEIRD NEWS",          "authors" : "",          "country" : "US",          "timestamp" : 1693070640        }      },      {        "_index" : "news",        "_id" : "WTrouIsBC1dvdsZHp2wd",        "_score" : 7.4066687,        "_source" : {          "link" : "https://www.huffpost.com/entry/san-francisco-news-crew-security-guard-shot-killed_n_61a2a9d8e4b0ae9a42af278a",          "headline" : "報道クルーの警備員が強盗報道中に撃たれ死亡",          "short_description" : "Kevin Nishitaが仕事中に腹部に撃たれ、組織的な小売り犯罪の増加の中で亡くなりました。",          "category" : "CRIME",          "authors" : "Daisy Nguyen, AP",          "country" : "US",          "timestamp" : 1692480894        }      }    ]  }

これまでに行ってきたのは「レキシカル検索」と呼ばれるものです。このタイプの検索では、システムは文書内の特定の単語やフレーズとの厳密な一致を求めます。つまり、ユーザーが「強盗」と入力した場合、検索クエリは「強盗」という語を含むすべての文書を特定します。この方法は最初は直感的に思えるかもしれませんが、その制限はすぐに明らかになるでしょう。

現在の検索クエリの問題点

類似した単語は異なる結果を返します

いくつかの例を見てみましょう、「強奪」というキーワードを検索した場合、どのような結果が得られるかを見てみましょう。

GET news/_search{  "query": {    "multi_match": {      "query": "強奪",      "fields": ["headline", "short_description"]    }  }}

以下は返ってきた結果です。

{    "total" : {      "value" : 2,      "relation" : "eq"    },    "max_score" : 7.9044275,    "hits" : [      {        "_index" : "news",        "_id" : "YTrouIsBC1dvdsZHh2jf",        "_score" : 7.9044275,        "_source" : {          "link" : "https://www.huffpost.com/entry/multiple-guns-robbery-wellston-market-missouri_n_62994cbee4b05fe694f296ad",          "headline" : "銃口で強奪された男性が2丁目の銃で応戦",          "short_description" : "被告の強盗犯は複数回打たれ、セントルイスの銃撃戦で2人の立ち往生者が負傷した。",          "category" : "犯罪",          "authors" : "メアリー・パーペンファス",          "country" : "IN",          "timestamp" : 1691458552        }      },      {        "_index" : "news",        "_id" : "YDrouIsBC1dvdsZH73UQ",        "_score" : 7.8303137,        "_source" : {          "link" : "https://www.huffpost.com/entry/michigan-militia-training-video-gretchen-whitmer_n_5f8b6e26c5b6dc2d17f78e0a",          "headline" : "ミシガン州知事誘拐計画で告発された組織の訓練映像が公開",          "short_description" : "「私は州に強奪され、奴隷にされるのにうんざりしています...彼らこそが敵です。完全に」と一人の容疑者がビデオで述べている。",          "category" : "政治",          "authors" : "メアリー・パーペンファス",          "country" : "IN",          "timestamp" : 1692613291        }      }    ]  }

簡単に言えば、これらは返ってきた文書の見出しです

1. "銃口で強奪された男性が2丁目の銃で応戦"2. "ミシガン州知事誘拐計画で告発された組織の訓練映像が公開"

これらの文書のいずれにも見出しまたは説明文に「強奪」という単語が含まれています。しかし、もしユーザーが「強盗」と検索した場合、結果としてはまったく異なる文書が表示されるでしょう。

[      {        "_index" : "news",        "_id" : "hjrouIsBC1dvdsZHgWdm",        "_score" : 8.164355,        "_source" : {          "link" : "https://www.huffpost.com/entry/lady-gaga-dog-walker-reward_n_62d82efee4b000da23fafad7",          "headline" : "レディー・ガガのドッグウォーカーの撃たれた容疑者への5,000ドルの懸賞金",          "short_description" : "暴力的な強奪事件に関与した男性のうちの一人が誤って4月に勾留されなかったまま行方不明になっています。",          "category" : "アメリカのニュース",          "authors" : "ステファニー・ダジオ, AP",          "country" : "IN",          "timestamp" : 1694863246        }      },      {        "_index" : "news",        "_id" : "YTrouIsBC1dvdsZHh2jf",        "_score" : 8.079888,        "_source" : {          "link" : "https://www.huffpost.com/entry/multiple-guns-robbery-wellston-market-missouri_n_62994cbee4b05fe694f296ad",          "headline" : "銃口で強奪された男性が2丁目の銃で応戦",          "short_description" : "被告の強盗犯は複数回打たれ、セントルイスの銃撃戦で2人の立ち往生者が負傷した。",          "category" : "犯罪",          "authors" : "メアリー・パーペンファス",          "country" : "IN",          "timestamp" : 1691458552        }      },      {        "_index" : "news",        "_id" : "RzrouIsBC1dvdsZHf2cP",        "_score" : 7.4066687,        "_source" : {          "link" : "https://www.huffpost.com/entry/guard-cat-hailed-as-hero_n_62e9a515e4b00f4cf2352a6f",          "headline" : "犯罪を未然に防いだ「警護猫」バンディットが英雄と称賛される",          "short_description" : "先週、少なくとも2人がミシシッピ州トゥペロの家に侵入しようとした際、猫は飼い主に知らせるために全力を尽くしました。",          "category" : "変わったニュース",          "authors" : "",          "country" : "US",          "timestamp" : 1693070640        }      },      {        "_index" : "news",        "_id" : "WTrouIsBC1dvdsZHp2wd",        "_score" : 7.4066687,        "_source" : {          "link" : "https://www.huffpost.com/entry/san-francisco-news-crew-security-guard-shot-killed_n_61a2a9d8e4b0ae9a42af278a",          "headline" : "強盗の報道を手助けしようとして射殺されたニュースクルーの警備員が死亡",          "short_description" : "アジア系のニシタ氏が仕事中に腹部を撃たれ、組織的な小売犯罪の増加の中で亡くなりました。",          "category" : "犯罪",          "authors" : "デイジー・ウィン、AP",          "country" : "US",          "timestamp" : 1692480894        }      }    ]
1. "レディー・ガガのドッグウォーカーの撃たれた容疑者への5,000ドルの懸賞金"2. "銃口で強奪された男性が2丁目の銃で応戦"3. "犯罪を未然に防いだ「警護猫」バンディットが英雄と称賛される"4. "強盗の報道を手助けしようとして射殺されたニュースクルーの警備員が死亡"

簡単に言えば、ユーザーが「強盗」と検索した場合と「強奪」と検索した場合で異なる結果が得られます。これは明らかに理想的ではありません。ユーザーがこれらのいずれか(または「rob」に関連する要素)を検索した場合は、クエリ内に「rob」という単語の異形(「活用」形とも呼ばれる)を含むすべてのドキュメントを表示する必要があります。「活用形」とも呼ばれる

ユーザーの意図の理解の欠如

「デザイナーの目標は、聞くこと、観察すること、理解すること、思い入れを持つこと、共感すること、総合すること、目に見えないものを見えるようにする洞察を得ることです。」— ヒルマン・カーティス

ユーザーのクエリと一致するドキュメントを取得しようとしていますが、これはユーザーの入力だけに留まるタスクではありません。追加のパラメーターに突っ込むことで、ユーザーの好みやニーズについてより豊かな理解を得ることができます。

たとえば、ユーザーがニュースを検索する場合、関連性だけでなく、ニュース記事の新鮮さも重要な要素となります。検索精度を高めるために、スコアリングメカニズムを調整することができます。

さらに、記事には「場所(location)」というフィールドもあります。このフィールドは、ニュースの地理的な起源を示しており、結果をさらに洗練させる機会となります。これを利用して、ユーザーの国の記事を優先的に表示することができます。

似たような単語が返されない

ユーザーが検索した単語の完全一致を含む記事のみを返すため、似たような単語を含む関連記事が見落とされている可能性があります。例えば、「theft」と検索すると、以下の記事が表示されます。

[      {        "_index" : "news",        "_id" : "dzrouIsBC1dvdsZHiGh1",        "_score" : 8.079888,        "_source" : {          "link" : "https://www.huffpost.com/entry/ap-us-church-theft-beheaded-statue_n_629504abe4b0933e7376f2fa",          "headline" : "Angel Statue Beheaded At Church, $2 Million Relic Stolen",          "short_description" : "The New York City church says its stolen 18-carat gold relic was guarded by its own security system and is irreplaceable due to its historical and artistic value.",          "category" : "CRIME",          "authors" : "Michael R. Sisak, AP",          "country" : "IN",          "timestamp" : 1699477455        }      },      {        "_index" : "news",        "_id" : "ATrouIsBC1dvdsZHrG2n",        "_score" : 7.4066687,        "_source" : {          "link" : "https://www.huffpost.com/entry/joseph-sobolewski-charge-dropped-mountain-dew-felony_n_617a15e0e4b0657357447ee2",          "headline" : "Prosecutors Drop Felony Charge Against Man Accused Of 43 Cent Soda Theft",          "short_description" : "Joseph Sobolewski faced up to seven years in prison after paying $2 for a Mountain Dew that cost $2.29 plus tax.",          "category" : "U.S. NEWS",          "authors" : "Nick Visser",          "country" : "IN",          "timestamp" : 1698883200        }      },      {        "_index" : "news",        "_id" : "ZDrouIsBC1dvdsZH73Uq",        "_score" : 7.153779,        "_source" : {          "link" : "https://www.huffpost.com/entry/missing-lemur-found_n_5f8b2c33c5b6dc2d17f76bdb",          "headline" : "'There's A Lemur!' 5-Year-Old Helps Crack San Francisco Zoo Theft Case",          "short_description" : """The arthritic, 21-year-old lemur is "agitated" but safe, zoo staff say.""",          "category" : "U.S. NEWS",          "authors" : "",          "country" : "IN",          "timestamp" : 1698560597        }      }    ]

「robbery(強盗)」という単語は「theft(窃盗)」とは異なる意味を持っているかもしれませんが、それでも関連性のある単語であり、ユーザーは「robbery」という単語も含む記事を見たいかもしれません(ただし、検索した単語と完全一致するドキュメントよりは関連性スコアが低いものになります)。

窃盗には似たような言葉がたくさんありますが、それぞれの類似度は異なります。例えば、「窃盗」という言葉は「万引き」により類似度が高く、「強盗」により類似度が低いかもしれません。しかし、特定の文脈ではどちらも同義語であり関連性がありますが、クエリの正確な単語ほど関連性はありません。「窃盗」という言葉が含まれている記事のみが返される現在の検索では、文書内の単語の類似性やクエリ内の単語の類似性は考慮されません。したがって、ユーザーが「窃盗」と検索した場合、他の類似した単語(例えば「強盗」や「強奪」)を含む記事も返すべきです。

誤字は無視されます

「ユーザーがそれを使えなければ、それは機能しません。」 – スーザン・ドレイ

もう一つの問題は、ユーザーによる誤字が空の結果を返すことです。ユーザーが誤って誤字を入力する可能性があることを理解しており、空の結果を返したくありません。例えば、「robbey」と検索してもGoogleニュースでは「robbery」に関連する結果が返されます。

単語の組み合わせによって意味が異なる

例を見てみましょう。以下のクエリをユーザーが行ったと仮定してみましょう。

GET news/_search{  "query": {    "multi_match": {      "query": "new jersey covid virus"    }  }}

私たちやあなたにとっては、ユーザーが「ニュージャージー」で「covid」や「virus」に関連するニュースを検索したいというのは明らかです。しかし、私たちの検索エンジンにとっては、これらの単語のそれぞれが同じ意味を持っているため、これらの単語の順序が重要であることを理解する方法はありません(例えば、「ニュージャージー」での「New」と「Jersey」)。以下に上位3つの結果を示します。

{        "_index" : "news",        "_id" : "0jrouIsBC1dvdsZH03FH",        "_score" : 15.199991,        "_source" : {          "link" : "https://www.huffpost.com/entry/covid-new-york-new-jersey-trend_n_60611769c5b6531eed0621da",          "headline" : "Virus Fight Stalls In Early Hot Spots New York, New Jersey",          "short_description" : "New Jersey has been reporting about 647 new cases for every 100,000 residents over the past 14 days. New York has averaged 548.",          "category" : "U.S. NEWS",          "authors" : "Marina Villeneuve and Mike Catalini, AP",          "country" : "US",          "timestamp" : 1697056489        }      },      {        "_index" : "news",        "_id" : "zzrouIsBC1dvdsZH23Ig",        "_score" : 12.708103,        "_source" : {          "link" : "https://www.huffpost.com/entry/new-variants-raise-worry-about-covid-19-virus-reinfections_n_602193e6c5b689330e31dcc4",          "headline" : "New Variants Raise Worry About COVID-19 Virus Reinfections",          "short_description" : "Scientists discovered a new version of the virus in South Africa that’s more contagious and less susceptible to certain treatments.",          "category" : "WORLD NEWS",          "authors" : "Marilynn Marchione, AP`",          "country" : "IN",          "timestamp" : 1693063095        }      },      {        "_index" : "news",        "_id" : "fTrouIsBC1dvdsZH6HQF",        "_score" : 11.707885,        "_source" : {          "link" : "https://www.huffpost.com/entry/new-york-covid-19-religious-gatherings_n_5fbf42b8c5b66bb88c6430ac",          "headline" : "Supreme Court Blocks New York COVID-19 Restrictions On Religious Gatherings",          "short_description" : "It was the first major decision since Justice Amy Coney Barrett joined the nation's highest court.",          "category" : "POLITICS",          "authors" : "Lawrence Hurley, Reuters",          "country" : "IN",          "timestamp" : 1693362371        }      },

上記の結果を注意深く見てみると、2番目の結果である「新バリアントはCOVID-19ウイルスの再感染についての心配を引き起こす」という結果は、完全にニュージャージーに関連していません。実際、説明を読んだ後、これは南アフリカでのCOVID-19感染と関連があるように思われます!

これは、単語「COVID」「virus」「New」がドキュメントの一部であるため、ドキュメントが高いスコアを取得するためです。しかし、これはユーザークエリとは全く関係ありません。検索システムは、「New」と「Jersey」が1つの用語として扱われるべきことを理解していません。

より関連性の高いフィールドの強化

「言葉には重みがありますので、重いことを言う場合は、適切な言葉を選びましょう。」- Lang Leav

記事の内容を理解する上でより有益なフィールドや値を強化することを決定することができます。たとえば、記事の見出しは記事の説明よりも意味があるかもしれません。

例として、クエリを検索しようとしているユーザーが選挙を検索しようとしていると仮定しましょう。以下が私たちのElasticsearchクエリです-

GET news/_search{  "query": {    "multi_match": {      "query": "選挙",      "type": "most_fields",       "fields": ["short_description", "headline"]    }  }}

以下は私たちが受け取る結果です-

{        "_index" : "news",        "_id" : "qDrouIsBC1dvdsZHwW-a",        "_score" : 15.736175,        "_source" : {          "link" : "https://www.huffpost.com/entry/new-york-city-board-of-elections-mess_n_60de223ee4b094dd26898361",          "headline" : "ニューヨーク市の選挙管理委員会はめちゃくちゃです",          "short_description" : "「党派的な選挙管理委員会を持つのには根本的な問題があります」とニューヨークの選挙弁護士は言います。",          "category" : "政治",          "authors" : "ダニエル・マランス",          "country" : "IN",          "timestamp" : 1689878099        }      },      {        "_index" : "news",        "_id" : "8zrouIsBC1dvdsZH63Si",        "_score" : 7.729385,        "_source" : {          "link" : "https://www.huffpost.com/entry/20-funniest-tweets-from-women-oct-31-nov-6_n_5fa209fac5b686950033b3e7",          "headline" : "今週の女性からの最も面白いツイート20選(10月31日〜11月6日)",          "short_description" : "「考えてみてください:選挙でも麻酔を使いましょう。」",          "category" : "女性",          "authors" : "キャロライン・ボローニャ",          "country" : "IN",          "timestamp" : 1694723723        }      },      {        "_index" : "news",        "_id" : "zzrouIsBC1dvdsZH8nVe",        "_score" : 7.353842,        "_source" : {          "link" : "https://www.huffpost.com/entry/childrens-books-elections-voting_l_5f728844c5b6f622a0c368a1",          "headline" : "子供向けの選挙と投票について教える25冊の絵本",          "short_description" : "親はこれらの物語を使ってアメリカの政治プロセスについて教育することができます。",          "category" : "育児",          "authors" : "キャロライン・ボローニャ",          "country" : "IN",          "timestamp" : 1697290393        }      },

2番目の記事「今週の女性からの最も面白いツイート20選(10月31日〜11月6日)」を見ると、選挙についてのようには見えません。しかし、説明に「選挙」という言葉があるため、Elasticsearchは関連性のある結果とみなしました。改善の余地があるかもしれません。ユーザーのクエリと一致する見出しを持つ記事の方が関連性が高いというのは直感的に理解できます。これを実現するために、Elasticsearchにheadingフィールドを強化するよう指示し、スコア計算においてshort_descriptionフィールドよりも重要な役割を与えることができます。

私たちのクエリでこれを行うのはかなり簡単です-

GET news/_search{  "query": {    "multi_match": {      "query": "選挙",      "type": "most_fields",       "fields": ["headline^4", "short_description"]    }  }}

fieldsに入れたheading^4に注意してください。これは単純にフィールド「heading」を4倍にブーストしています。さて、結果を見てみましょう。

{        "_index" : "news",        "_id" : "qDrouIsBC1dvdsZHwW-a",        "_score" : 37.7977,        "_source" : {          "link" : "https://www.huffpost.com/entry/new-york-city-board-of-elections-mess_n_60de223ee4b094dd26898361",          "headline" : "Why New York City’s Board Of Elections Is A Mess",          "short_description" : "“There’s a fundamental problem having partisan boards of elections,” said a New York elections attorney.",          "category" : "POLITICS",          "authors" : "Daniel Marans",          "country" : "IN",          "timestamp" : 1689878099        }      },      {        "_index" : "news",        "_id" : "zzrouIsBC1dvdsZH8nVe",        "_score" : 29.415367,        "_source" : {          "link" : "https://www.huffpost.com/entry/childrens-books-elections-voting_l_5f728844c5b6f622a0c368a1",          "headline" : "25 Children's Books That Teach Kids About Elections And Voting",          "short_description" : "Parents can use these stories to educate their little ones about the American political process.",          "category" : "PARENTING",          "authors" : "Caroline Bologna",          "country" : "IN",          "timestamp" : 1697290393        }      },      {        "_index" : "news",        "_id" : "_jrouIsBC1dvdsZH3HKZ",        "_score" : 29.415367,        "_source" : {          "link" : "https://www.huffpost.com/entry/shirley-weber-first-black-california-secretary-of-state_n_6014651ec5b6aa4bad33e87b",          "headline" : "Shirley Weber Sworn In As California's First Black Elections Chief",          "short_description" : "She vacates her Assembly seat to be the new secretary of state, replacing Alex Padilla, who last week became the first Latino U.S. senator for California.",          "category" : "POLITICS",          "authors" : "Sarah Ruiz-Grossman",          "country" : "IN",          "timestamp" : 1697300728        }      },      {        "_index" : "news",        "_id" : "NzrouIsBC1dvdsZHnWvd",        "_score" : 26.402336,        "_source" : {          "link" : "https://www.huffpost.com/entry/josh-hawley-democrats-dont-accept-elections_n_61ea1949e4b01440a689bedc",          "headline" : "Sen. Josh Hawley Says, Without Irony, That Democrats Don't Accept Elections They Lose",          "short_description" : "The Missouri Republican led the charge on Jan. 6 to object to Joe Biden's win -- right after he saluted pro-Trump protesters gathering at the U.S. Capitol.",          "category" : "POLITICS",          "authors" : "Josephine Harvey",          "country" : "IN",          "timestamp" : 1692046727        }      },

今、上位の結果には「election」という単語が見れるため、返された記事はより関連性が高いことがわかります。

関数に基づくブースティング

特定のフィールドにブーストをかけるだけでなく、ニュース検索時にユーザーが求める内容に基づいた2つの新しいブーストのタイプを紹介したいと思います。

  1. ユーザーの国の記事をブーストしたい。国に基づいてフィルタリングするだけでは、上位に関連性の低い結果が表示される可能性があるため、国を無視するわけではありませんが、記事がユーザーの国から多く来るように重みを与えたいです。
  2. より最近のニュースをブーストしたい。単に新しさに基づいてソートするわけではなく、関連性とバランスを取るため、最近のニュースにも重みを与えたいです。

これをやってみましょう。

Elasticsearchでは、function_scoreクエリを使用してカスタムスコアリング関数、つまりブースティングを適用することができます。function_scoreクエリでは、さまざまな関数に基づいてドキュメントのスコアを変更することができます。簡単に言えば、条件に基づいて特定のドキュメントをブーストできます。

まず、ユーザーの国をブーストしてみましょう。ユーザーの国を「US」と仮定し、それをElasticsearchに送信するクエリに組み込みます。これを実現するには、function_scoreブロックを追加する必要があります。このブロックでは、クエリの結果にカスタムスコアリング関数を適用できます。一致するドキュメントとブースト値に条件を指定することもできます。

以下のように、ユーザーの国をブーストする関数を定義できます。

{  "filter": {    "term": {      "country.keyword": "US"    }  },  "weight": 2}

これにより、国が「US」の記事のスコアが2倍になります。

次に、最新のニュースをトップにブーストしてみましょう。これはfield_value_factorを使用して行うことができます。 field_value_factor関数を使用すると、ドキュメントのフィールドを使用してスコアに影響を与えることができます。これがまさに私たちが求める動作です。以下は、その構文です。

{  "field_value_factor": {    "field": "timestamp",    "factor": 2  }}

factorの項目は、指定したフィールドの値がスコアにどのように影響するかを示します。この関数により、より新しいタイムスタンプを持つドキュメントが高いスコアを取得します。

最終的なクエリは次のようになります。

GET news/_search{  "query": {    "bool": {      "must": [        {          "multi_match": {            "query": "covid",            "fields": ["headline^4", "short_description"]          }        },        {          "function_score": {            "query": {              "multi_match": {                "query": "covid",                "fields": ["headline^4", "short_description"]              }            },            "functions": [              {                "filter": {                  "term": {                    "country.keyword": "US"                  }                },                "weight": 2              }, {                "field_value_factor": {                  "field": "timestamp",                  "factor": 2                }              }            ]          }        }      ]    }  }}

これにより、最新のドキュメントとユーザーの国のドキュメントがより高いスコアを取得します。 weightフィールドとfactorフィールドの値を設定することで、このバランスを調整できます。

ファジー検索

次に、検索クエリのタイポを修正しましょう。

Elasticsearchでは、スペルや文字のわずかな違いがあっても指定された用語に一致するドキュメントを取得するために、ファジー検索を実行することができます。これを行うには、単純にクエリにfuzzinessフィールドを追加するだけです。最終的なクエリは次のようになります。

GET news/_search{  "query": {    "bool": {      "must": [        {          "multi_match": {            "query": "covi",            "fields": ["headline^4", "short_description"],            "fuzziness": 1          }        },        {          "function_score": {            "query": {              "multi_match": {                "query": "covi",                "fields": ["headline^4", "short_description"],                "fuzziness": 1              }            },            "functions": [              {                "filter": {                  "term": {                    "country.keyword": "US"                  }                },                "weight": 2              }, {                "field_value_factor": {                  "field": "timestamp",                  "factor": 2                }              }            ]          }        }      ]    }  }}

fuzzinessを追加するだけでスペルの修正以外にもスペリング訂正には多くの要素があります。詳細を知りたい場合は、このブログ記事をチェックしてください。

まとめ

このブログ記事では、Elasticsearchの基本から具体的な手法と検索クエリの作成の基礎まで、Elasticsearchの細部について詳しく説明しました。Elasticsearchのレスポンスを理解し、効果的な探索の基礎を築くために、基本的な検索クエリについて説明しました。

レキシカルサーチを探求していく中で、現在の検索アプローチにいくつかのクセを見つけました。これらの課題に対処するために、ブースティングとぼかしという便利なツールを導入しました。これらは、検索を微調整し、現実世界のデータの複雑さに対処するための役立つ手法です。

ここでの話し合いをまとめると、検索の優れたポイントに向けた旅の一時停車だと考えてください。次の部分では、現在の検索アプローチで特定の問題を克服するための高度な戦略について詳しく説明します。キーワードとのマッチングだけでなく、それらの意味を理解することに重点を置いたセマンティックサーチの魅力的な世界への展開に備えてください。より直感的でコンテキストに敏感な検索体験への道を築くための準備をしましょう。Elasticsearchの冒険を次のレベルに進める準備をしてください!

Elasticsearchの旅を楽しんでいただけましたか?もっと記事を読むためにVoAGIでフォローしてください。より短時間で知識を得るためのヒントやチートシートなどは、LinkedInで私をフォローしてください。例えば、Elasticsearchについて読んでいる間に、特定のスコアリング関数であるtf-idfがどのように機能するかを説明した5分程度の投稿を行いました。テクノロジーとデータの探求を通じてつながっていましょう!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more