Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

API リファレンス

Index

Laurus 検索エンジンをラップするメインクラスです。

class Index:
    def __init__(self, path: str | None = None, schema: Schema | None = None) -> None: ...

コンストラクタ

パラメータデフォルト説明
pathstr | NoneNone永続ストレージのディレクトリパス。None の場合はインメモリインデックスを作成します。
schemaSchema | NoneNoneスキーマ定義。省略時は空のスキーマが使用されます。

メソッド

メソッド説明
put_document(id, doc)ドキュメントをアップサート(upsert)します。同じ ID の既存バージョンをすべて置換します。
add_document(id, doc)既存バージョンを削除せずにドキュメントチャンクを追記します。
get_documents(id) -> list[dict]指定 ID の全保存バージョンを返します。
delete_documents(id)指定 ID の全バージョンを削除します。
commit()バッファリングされた書き込みをフラッシュし、すべての保留中の変更を検索可能にします。
search(query, *, limit=10, offset=0) -> list[SearchResult]検索クエリを実行します。
stats() -> dictインデックス統計(document_countvector_fields)を返します。

search の query 引数

query パラメータは以下のいずれかを受け付けます:

  • DSL 文字列(例: "title:hello""content:\"memory safety\"")
  • Lexical クエリオブジェクトTermQueryPhraseQueryBooleanQuery など)
  • Vector クエリオブジェクトVectorQueryVectorTextQuery
  • SearchRequest(完全な制御が必要な場合)

Schema

Index のフィールドとインデックスタイプを定義します。

class Schema:
    def __init__(self) -> None: ...

フィールドメソッド

メソッド説明
add_text_field(name, *, stored=True, indexed=True, term_vectors=False, analyzer=None)全文フィールド(転置インデックス、BM25)。analyzer には組込名("standard" / "english" / "keyword" / "simple" / "noop"、または add_analyzer で登録したカスタム名)か、{"language": "japanese", "mode": "normal", "dict": "/var/lib/lindera/ipadic"} のようなパラメータ付きプリセットの dict を渡せます。文字列単独の "japanese" は Lindera 辞書パスが必須なため拒否されます。
add_integer_field(name, *, stored=True, indexed=True, multi_valued=False)64 ビット整数フィールド。multi_valued=True で整数配列を受け付け(範囲クエリは “any match”)。
add_float_field(name, *, stored=True, indexed=True, multi_valued=False)64 ビット浮動小数点フィールド。multi_valued=True で浮動小数点配列を受け付け(範囲クエリは “any match”)。
add_boolean_field(name, *, stored=True, indexed=True)ブールフィールド。
add_bytes_field(name, *, stored=True)生バイトフィールド。
add_geo_field(name, *, stored=True, indexed=True)地理座標フィールド(緯度/経度)。
add_geo3d_field(name, *, stored=True, indexed=True)3D ECEF カルテシアン座標フィールド(x, y, z はメートル)。詳細は Geo3d の概念
add_datetime_field(name, *, stored=True, indexed=True)UTC 日時フィールド。
add_hnsw_field(name, dimension, *, distance="cosine", m=16, ef_construction=200, embedder=None)HNSW 近似最近傍ベクトルフィールド。
add_flat_field(name, dimension, *, distance="cosine", embedder=None)Flat(総当たり)ベクトルフィールド。
add_ivf_field(name, dimension, *, distance="cosine", n_clusters=100, n_probe=1, embedder=None)IVF 近似最近傍ベクトルフィールド。

その他のメソッド

メソッド説明
add_embedder(name, config)名前付きエンベダー定義を登録します。config"type" キーを持つ辞書です(下記参照)。
set_default_fields(fields)デフォルト検索フィールドを設定(文字列のリスト)。
set_dynamic_field_policy(policy)未宣言フィールドの扱いを設定。policy"strict" / "dynamic"(デフォルト)/ "ignore"。詳細は下記を参照。
dynamic_field_policy()現在のポリシーを小文字の文字列で返す。
field_names()全フィールド名を返す。

Dynamic field policy(動的フィールドポリシー)

ドキュメントに含まれるがスキーマに宣言されていないフィールドの扱いを制御します:

  • "strict" — ドキュメントを拒否
  • "dynamic"(デフォルト)— 各未宣言フィールドの型を推論してスキーマに追加。警告: integer フィールドに入ってきた float 値は静かに切り捨てられます(3.143)。厳密さが必要なら "strict" を使用してください
  • "ignore" — 未宣言フィールドを静かに破棄

詳細な挙動マトリクスは スキーマとフィールド を参照してください。

エンベダータイプ

"type"必須キーFeature Flag
"precomputed"(常に利用可能)
"candle_bert""model"embeddings-candle
"candle_clip""model"embeddings-multimodal
"openai""model"embeddings-openai

距離メトリクス

説明
"cosine"コサイン類似度(デフォルト)
"euclidean"ユークリッド距離
"dot_product"内積
"manhattan"マンハッタン距離
"angular"角度距離

クエリクラス

TermQuery

TermQuery(field: str, term: str)

指定フィールドに完全一致する語句を含むドキュメントを検索します。

PhraseQuery

PhraseQuery(field: str, terms: list[str])

指定した語句が順序どおりに含まれるドキュメントを検索します。

FuzzyQuery

FuzzyQuery(field: str, term: str, *, max_edits: int = 2)

編集距離が max_edits 以内の近似一致を検索します。max_edits はキーワード専用引数です。

WildcardQuery

WildcardQuery(field: str, pattern: str)

ワイルドカードパターン検索。* は任意の文字列、? は任意の1文字に一致します。

NumericRangeQuery

NumericRangeQuery(field: str, *, min: int | float | None = None, max: int | float | None = None)

[min, max] の範囲内の数値を検索します。開いた境界には None を指定する (または省略する)と開放されます。minmax はキーワード専用引数です。 数値型(整数または浮動小数点)は min/max の Python 型から推論されます。

GeoDistanceQuery

GeoDistanceQuery.within_radius(
    field: str, lat: float, lon: float, distance_m: float,
)

地理的距離検索(半径指定)。指定した地点から distance_m メートル以内の (lat, lon) 座標を持つドキュメントを返します。

GeoBoundingBoxQuery

GeoBoundingBoxQuery.within_bounding_box(
    field: str,
    min_lat: float, min_lon: float,
    max_lat: float, max_lon: float,
)

地理的範囲(バウンディングボックス)検索。軸並行 [min_lat, max_lat] × [min_lon, max_lon] 内の (lat, lon) 座標を持つドキュメントを返します。

Geo3dDistanceQuery

Geo3dDistanceQuery.within_sphere(
    field: str, x: float, y: float, z: float, distance_m: float,
)

3D ECEF 座標フィールドへの球距離検索。中心 (x, y, z) から distance_m メートル以内 の座標を持つドキュメントを返します。ECEF の理論については Geo3d の概念 を参照。

Geo3dBoundingBoxQuery

Geo3dBoundingBoxQuery.within_box(
    field: str,
    min_x: float, min_y: float, min_z: float,
    max_x: float, max_y: float, max_z: float,
)

軸並行 3D 範囲(AABB)検索。[min_x, max_x] × [min_y, max_y] × [min_z, max_z] 内 にある ECEF 座標を持つドキュメントを返します。

Geo3dNearestQuery

Geo3dNearestQuery.k_nearest(
    field: str,
    x: float, y: float, z: float,
    k: int,
    *,
    initial_radius_m: float | None = None,
    max_radius_m: float | None = None,
)

3D ECEF 座標フィールドへの k 最近傍検索。(x, y, z) から最も近い k 件のドキュ メントを返します。initial_radius_m / max_radius_m は反復拡張サーチの探索コーン を調整します。

BooleanQuery

bq = BooleanQuery()
bq.must(query)
bq.should(query)
bq.must_not(query)

複合ブールクエリ。引数なしでコンストラクタを呼び出し、must / should / must_not メソッドで節を一つずつ追加します。各メソッドは任意のクエリ オブジェクト(ネストされた BooleanQuery も含む)を受け付けます。

must 節はすべて一致する必要があり、must_not 節は一致してはなりません。 should 節はスコアリングに寄与し、must 節が無い場合は少なくとも1つが 一致する必要があります。

SpanQuery

# 単一語句
SpanQuery.term(field: str, term: str)

# Near: slop 位置以内の語句
SpanQuery.near(field: str, terms: list[str], *, slop: int = 0, ordered: bool = True)

# ネストされた SpanQuery 句を使った Near
SpanQuery.near_spans(field: str, clauses: list[SpanQuery], *, slop: int = 0, ordered: bool = True)

# Containing: big スパンが little スパンを含む
SpanQuery.containing(field: str, big: SpanQuery, little: SpanQuery)

# Within: 最大距離での include スパンと exclude スパン
SpanQuery.within(field: str, include: SpanQuery, exclude: SpanQuery, distance: int)

位置・近接スパンクエリ。静的ファクトリメソッドで構築します。near は語句 文字列のリストを受け取り、near_spans はネスト式のために SpanQuery オブジェクトのリストを受け取ります。slopordered はキーワード専用 引数です。

VectorQuery

VectorQuery(field: str, vector: list[float])

事前計算済みエンベディングベクトルを使った近似最近傍検索を行います。

VectorTextQuery

VectorTextQuery(field: str, text: str)

クエリ時に text をエンベディングに変換してベクトル検索を行います。インデックスにエンベダーの設定が必要です。


SearchRequest

高度な制御が必要な場合の完全なリクエストクラスです。

class SearchRequest:
    def __init__(
        self,
        *,
        query=None,
        lexical_query=None,
        vector_query=None,
        filter_query=None,
        fusion=None,
        limit: int = 10,
        offset: int = 0,
    ) -> None: ...
パラメータ説明
queryDSL 文字列または単一クエリオブジェクト。lexical_query / vector_query と排他的。
lexical_query明示的なハイブリッド検索の Lexical コンポーネント。
vector_query明示的なハイブリッド検索の Vector コンポーネント。
filter_queryスコアリング後に適用する Lexical フィルター。
fusionフュージョンアルゴリズム(RRF または WeightedSum)。両コンポーネント指定時のデフォルトは RRF(k=60)
limit最大結果件数(デフォルト 10)。
offsetページネーションオフセット(デフォルト 0)。

SearchResult

Index.search() が返すクラスです。

class SearchResult:
    id: str          # 外部ドキュメント識別子
    score: float     # 関連性スコア
    document: dict | None  # 取得されたフィールド値。stored=False の場合は None

フュージョンアルゴリズム

RRF

RRF(k: float = 60.0)

逆順位フュージョン(Reciprocal Rank Fusion)。Lexical と Vector の結果リストを順位位置によってマージします。k は平滑化定数で、値が大きいほど上位ランクの影響が小さくなります。

WeightedSum

WeightedSum(lexical_weight: float = 0.5, vector_weight: float = 0.5)

両スコアリストをそれぞれ正規化した後、lexical_weight * lexical_score + vector_weight * vector_score として結合します。


テキスト解析

SynonymDictionary

class SynonymDictionary:
    def __init__(self) -> None: ...
    def add_synonym_group(self, synonyms: list[str]) -> None: ...

WhitespaceTokenizer

class WhitespaceTokenizer:
    def __init__(self) -> None: ...
    def tokenize(self, text: str) -> list[Token]: ...

SynonymGraphFilter

class SynonymGraphFilter:
    def __init__(
        self,
        dictionary: SynonymDictionary,
        keep_original: bool = True,
        boost: float = 1.0,
    ) -> None: ...
    def apply(self, tokens: list[Token]) -> list[Token]: ...

Token

class Token:
    text: str
    position: int
    start_offset: int
    end_offset: int
    boost: float
    stopped: bool
    position_increment: int
    position_length: int

フィールド値の型マッピング

Python の値は自動的に Laurus の DataValue 型に変換されます:

Python 型Laurus 型備考
NoneNull
boolBoolint より先にチェック
intInt64
floatFloat64
strText
bytesBytes
list[float]Vector要素は f32 に変換
(lat, lon) タプルGeo2 つの float
datetime.datetimeDateTimeisoformat() 経由で変換