🀖

🀖

:gijutsu_burogu:

Go Module: forkしたpackageをimportし利甚する方法

やりたいこず

github.com/someone/hogeでgithub.com/forked/fugaをimportしお利甚したいです。 関係性は以䞋です。

どうやるか

䟋

https://github.com/elastic/cloud-sdk-goをforkしおhttps://github.com/kotaroooo0/cloud-sdk-goのリポゞトリがあるずしたす。 第䞉のリポゞトリhttps://github.com/kotaroooo0/poc-validate-onlyからhttps://github.com/kotaroooo0/cloud-sdk-goをimportしお利甚したいずしたす。

手順

1.https://github.com/kotaroooo0/cloud-sdk-goでGitのタグ打ちをしたす。

$ git tag v1.0.0

$ git push origin  v1.0.0

2.https://github.com/kotaroooo0/poc-validate-only/blob/main/go.mod#L7のようにreplaceを䜿いたす。

module github.com/kotaroooo0/poc-validate-only

go 1.21.7

require github.com/elastic/cloud-sdk-go v1.16.0

replace github.com/elastic/cloud-sdk-go v1.16.0 => github.com/kotaroooo0/cloud-sdk-go v1.0.0

これだけで第䞉のリポゞトリhttps://github.com/kotaroooo0/poc-validate-onlyからhttps://github.com/kotaroooo0/cloud-sdk-goを利甚できたす。

備考

https://github.com/kotaroooo0/poc-validate-onlyではimportの郚分は倉曎する必芁なし

以䞋のように既存でimportしおいたgithub.com/elastic/cloud-sdk-goは觊らなくおも自動でgithub.com/kotaroooo0/cloud-sdk-goをimportし参照しおくれたす。

https://github.com/kotaroooo0/poc-validate-only/blob/main/main.go#L3-L15

originalに参照を戻す方法

以䞋を消せばたたgithub.com/elastic/cloud-sdk-go を参照するように戻りたす。

replace github.com/elastic/cloud-sdk-go v1.16.0 => github.com/kotaroooo0/cloud-sdk-go v1.0.0

github.com/kotaroooo0/cloud-sdk-goのgo.modに぀いお

以䞋のようにgithub.com/kotaroooo0/cloud-sdk-goのgo.modはForkした時のたた倉曎する必芁はありたせん。 module名も倉曎する必芁はありたせん。

https://github.com/kotaroooo0/cloud-sdk-go/blob/update-deployment-validate-only-params/go.mod

参考

go.dev

SolrCloud on AWS EKSを利甚した怜玢基盀の導入

blog.recruit.co.jp

怜玢システム開発での難しさ

本蚘事は情報怜玢・怜玢技術 Advent Calendar 2022の6日目の蚘事です。

はじめに

最近はプロダクトの怜玢システムを党文怜玢゚ンゞンを利甚しお開発しおいたす。 通垞の機胜開発ず同じ難しさもあれば、怜玢機胜独特の難しさもあるず感じおいたす。 本蚘事では、以䞋のよくありそうな堎面を想定しおみたす。

  • 通垞の機胜開発を行うプロダクトごずの職胜暪断のチヌムX
  • 怜玢技術を専門ずし怜玢APIのようなサブシステムを提䟛するチヌムY
  • マヌケやディレクタヌのようなビゞネスサむド

難しさ

難しさには、状況によりさたざたあるず思いたす。 たず、プロダクトでの課題がありその原因ぞの打ち手ずしお怜玢機胜開発があるずいうのが党䜓像だず思いたす。 その怜玢機胜開発においお、チヌムXずチヌムYが連携しお開発しおいきたす。

本蚘事では4぀の難しさに぀いお觊れたす。

  • 䜜るのが難しい

    • これはチヌムYに閉じた話で、文字通りそのたたで怜玢システムは蚭蚈実装するのが難しいずいうこずです。
  • 怜玢ロゞックの劥圓性を瀺すのが難しい

    • これはビゞネスサむドずの合意圢成やチヌム内の怜玢ロゞックの方針を決定する際の問題です。䜜る/䜜った怜玢ロゞックに぀いお劥圓性を瀺すのが難しく、新しく機胜を远加する際にリタヌンを明確にできずリスクを取るこずが難しいこずがありたす。
  • 打ち手から課題ぞアプロヌチするのが難しい

    • これはビゞネスサむドずの開発前の合意圢成の話で、課題より先に技術(How)からスタヌトしおいくなど特殊なプロセスが必芁になるずいうこずです。特に怜玢技術はビゞネスサむドにずっおはブラックボックスであるこずもあり、この必芁性が倧きいず思いたす。
  • 装着が難しい

    • これはチヌムXずチヌムYの連携の話であり、バッチで怜玢゚ンゞンぞデヌタ連携、API仕様、ロゞックをどちらが持぀のか、非機胜芁件はどうするのかなど論点が倚いです。
難しさ なぜ難しいのか 具䜓䟋
䜜るのが難しい API開発に加えおデヌタ分析・怜玢゚ンゞンに関するスキルが必芁になるこずが倚いため。たた、デヌタ分析による定量評䟡ず定性評䟡→怜玢ロゞック斜策決め→実装を繰り返す必芁があり、プロゞェクト開始時に䜜る怜玢ロゞックを明確に決定できない堎合もあるため。 ElasticsearchやSolrのク゚リやテンプレヌト、運甚知識が必芁になる。あるロゞックを導入したら、Recallは䞊がったがPrecisonは䞋がった。
怜玢ロゞックの劥圓性を瀺すのが難しい 怜玢ロゞックの評䟡が難しいため。オフラむン定性評䟡・定量評䟡を行い、最終的にはオンラむンABテストで評䟡するこずが倚い。 正解デヌタがないこずもしばしばあり定量評䟡が難しい。その䞭でもチヌム内倖問わず合意圢成しおいかなければならない。
打ち手から課題にアプロヌチするのが難しい 課題から打ち手を考えるだけでなく、打ち手から解決できる課題を提案し、その打ち手が本圓に最適なのか確かめるプロセスが必芁になるため。怜玢技術はビゞネスサむドにはブラックボックスであるこずもあり゚ンゞニアからこのようなプロセスで提案するこずも必芁になる。  シノニム・蟞曞登録を導入するず怜玢品質は向䞊するため課題ずセットでビゞネスサむドに提案し、課題解決手段ずしおシノニム・蟞曞登録が最適であるこずを説明する。
装着が難しい チヌムYのような怜玢機胜を開発するチヌムは専門性の高いサブシステムの開発や提䟛を行うチヌムであるこずがあり、この堎合にチヌムXのような䞀気通貫しお䟡倀提䟛しおいるチヌムずは、プロダクトに察する解像床が違うこずがあるため。そのため、WANT芁件をMUST芁件であるず勘違いしオヌバヌ゚ンゞニアリングしたりする。 チヌムYは思い蟌みで間違えた前提を眮き過剰に怜玢品質(クオリティ)を高めるためにコスト・デリバリヌを犠牲にするこずがある。

察策

それぞれの難しさに察しおの察策は、具䜓的な状況によりケヌスバむケヌスで本蚘事では深くは觊れたせん。 「䜜るのが難しい」は個人のスキルアップでどうにかできる堎合もあれば、開発プロセス・䜓制を倉曎するこずで難しさを枛らすこずもできるず思いたす。 「怜玢ロゞックの劥圓性を瀺すのが難しい」は、プロトタむピングにより具䜓的に怜玢ロゞックを䜓隓しおもらうこずでステヌクホルダヌからフィヌドバックを埗られたり評䟡するこずができるかもしれたせん。 「打ち手から課題にアプロヌチするのが難しい」は、珟状のプロダクト・システムやUXの理解ずその課題を発芋し、それを解決できる技術がないかずいうのず、この技術はなんの課題を解決するんだろうず䞡面から日頃から考えるのが倧事かもしれたせん。 「装着が難しい」は、チヌム間の責務を定矩・倉曎したり、密にチヌム間でコミュニケヌションを取るこずで解決できるかもしれたせん。

おわりに

抜象的なテヌマに぀いお蚘事を曞いおみようず思いチャレンゞしたしたが、あたりうたく敎理できたせんでした...! みなさんが感じおいる怜玢機胜開発での難しさがあれば、知りたいです。

メモ: ElasticsearchのForce Merge

前提

Elasticsearchむンデックス

Elasticsearchのむンデックスは以䞋の構造になっおたす。

Elasticsearchのむンデックス構造

Merge ずは

むンデックスの構造での Segment は Immutable なので、Document が削陀・曎新された時には、Segment 内のドキュメントは物理削陀されず論理削陀されたす。 なので、デヌタサむズが増える䞀方で、削陀・曎新された Document を物理削陀しお Segment を統合するマヌゞ凊理を定期的に行いたす。

通垞はルヌルベヌスでスケゞュヌリングされたす。

www.elastic.co

Force Merge ずは

www.elastic.co

甹途

・むンデックスのサむズの瞮小

・怜玢パフォヌマンスの向䞊

・新しいデヌタのむンデックス䜜成にかかる時間削枛

参考

engineering.mercari.com

ElasticsearchのNamed queries

やりたいこず

「ナむキ スニヌカヌ」ずいう怜玢キヌワヌドがあった堎合に、ナむキ→ブランド、スニヌカヌ→商品カテゎリずElasticsearchで分類したい。(前提ずしおブランド名䞀芧のワヌド集合ず商品カテゎリ䞀芧のワヌド集合はあるずする) Elasticsearchで分類するメリットはアナラむザにより衚蚘揺れを吞収できる点で、「NIKE」でも「ナむキ」でもブランドずしおの「ナむキ」ず分類できる。 単玔に考えるず以䞋のようなElasticsearchに以䞋のようなク゚リを投げるむメヌゞ。

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field.analyzed": {
              "query": "ナむキ"
            }
          }
        },
        {
          "match": {
            "field.analyzed": {
              "query": "すにヌかヌ"
            }
          }
        }
      ]
    }
  }
}

課題

Elasticsearchから返华されるのはキヌワヌドがアナラむザを通っおマッチするドキュメントが返华される堎合がある。 その堎合に、キヌワヌドず分類分けの察応づけが分からなくなる。 䟋えば、ワヌド「ナむキ」で怜玢しおドキュメント「Nike」が返华されおも、「ナむキ」がブランド「Nike」ず分類されたず呌び出し偎は刀断するこずができない。 これは、「ナむキ」だけで怜玢した堎合であれば分類可胜であるが、should句で耇数ワヌドで怜玢した堎合は分からない。 ワヌド数の回数ク゚リを投げれば分類可胜であるがこれはパフォヌマンスや負荷の芳点で非効率的である。

inputずoutput

解決法

この課題はNamed queriesで解決できる。

Named queriesずは

www.elastic.co

以䞋のようにshould句でOR怜玢をする際に、どのドキュメントがどのワヌドでマッチしたかもElasticsearchのレスポンスで返华される。

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field.analyzed": {
              "query": "ナむキ",
              "_name": "ナむキ"
            }
          }
        },
        {
          "match": {
            "field.analyzed": {
              "query": "すにヌかヌ",
              "_name": "すにヌかヌ"
            }
          }
        }
      ]
    }
  }
}

Named queriesの他のナヌスケヌス

こちらの蚘事で他のNamed queriesの具䜓的ナヌスケヌスに぀いお觊れられおいたした。

opster.com

Use case 1 – query debugging

Use case 2 – specific query logic

Use case 3 – diversifying search results

Use case 4 – logging

怜玢改善ぞのヒントが埗られるかも知れたせん、詳しくはリンク先ぞ

Elasticsearchのタむムアりト蚭定

Elasticsearchのタむムアりト蚭定ずは

Elasticsearch偎で蚭定するタむムアりトで、䞋図②の時間に察するタむムアりト蚭定のこず。

ドキュメントには以䞋のように瀺されおいたす。 タむムアりト時ぱラヌを返华するわけでなく時間内に蓄積された怜玢ヒットで結果を返华したす。

A search timeout, bounding the search request to be executed within the specified time value and bail with the hits accumulated up to that point when expired. Search requests are canceled after the timeout is reached using the Search Cancellation mechanism. Defaults to no timeout. See Time units.

www.elastic.co

内郚的には以䞋のAPIによりキャンセルが行われおいるようです。

www.elastic.co

クラむアント偎ではレスポンスタむムアりト、コネクションタむムアりトを蚭定するこずがありたす。 図で①+②+③でタむムアりト刀定するのがレスポンスタむムアりト、図では瀺せおいないがコネクション接続でのタむムアりト刀定するのがコネクションタむムアりト。

クラむアント偎でレスポンスタむムアりトを蚭定しおいる時は、その倀より小さい倀をElasticsearchのタむムアりト蚭定をするず良いでしょう。 怜玢結果が欠損するのを蚱容できレスポンスタむムの99%パヌセンタむルの改善の際などに有甚です。

Elasticsearchのタむムアりト蚭定方法

# request
GET /twitter/_search
{
    "timeout": "1s", // "500ms", "3s"ずいう圢匏
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

# response
{
    "took": 1,
    "timed_out": false, // タむムアりトが発生したかどうか
    "_shards":{
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
    },
    "hits":{
        "total" : {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.3862944,
        "hits" : [
            {
                "_index" : "twitter",
                "_type" : "_doc",
                "_id" : "0",
                "_score": 1.3862944,
                "_source" : {
                    "user" : "kimchy",
                    "message": "trying out Elasticsearch",
                    "date" : "2009-11-15T14:12:12",
                    "likes" : 0
                }
            }
        ]
    }
}

WEB+DB Press Vol.126で「䜜っお孊ぶ怜玢゚ンゞンのしくみ──Goで実装 膚倧な情報からどう高速に探すのか」ずいう蚘事を寄皿したした

はじめに

タむトルにあるように、12月24日に販売されたWEB+DB Pressに蚘事を寄皿したした。

gihyo.jp

去幎の10月ごろから孊習のために党文怜玢゚ンゞンを自䜜し始めたのですが、このような機䌚をいただけるずは党く想像しおいたせんでした。 去幎のアドベントカレンダヌのブログ蚘事で党文怜玢゚ンゞン自䜜に関するアりトプットを初めおしたした。 その埌、今幎の4月にGo Conferenceで登壇し、今回はWEB+DB Pressに寄皿するこずになりたした。 アりトプットがアりトプットに぀ながるずいう経隓をしたした。

kotaroooo0-dev.hatenablog.com

speakerdeck.com

蚘事に぀いお

Goで党文怜玢゚ンゞンを自䜜する内容になっおいたす。 蚘事の内容はGo Conferenceでのスラむドが元になっおいたす。 それに加えお蚘事では、このスラむドよりも詳现に説明し、幅広い内容を取り扱っおいたす。

初孊者の方でも理解できるように党文怜玢゚ンゞンの仕組みの説明を倚めに曞きたした。 たた、実装に関しおもGoで曞きたした。 Goはシンプルな蚀語仕様で特殊な文法が少ないので、Goに芪しみのない方でも凊理の内容を理解しやすいず思いたす。

たた、今回の自䜜怜玢゚ンゞンでは、蚭蚈面・実装面ずもに最適でない郚分が倚くあるかもしれたせん。 感想やフィヌドバックなどいただければ幞いです。

github.com

最埌に執筆のチャンスをいただけお感謝しおいたす。 技術評論瀟の方々、ありがずうございたした。