Solrで完全一致するクエリを実行したい | KandaSearch Community Support Forum

Solrで完全一致するクエリを実行したい

トピック作成者:ks-solruserml-bot (2025/04/30 11:43 投稿)
2
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/v9n95cok30rtdp048k4h5gctp2cvjxlj into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

たとえば、あるドキュメントの属性(たとえば Description)に対して「完全一致(MATCHES)」検索を行いたいとします。
ここで言う「完全一致」とは、検索文字列が Description フィールドの内容全体と一致している必要があるという意味です。

たとえば Description = "dog cat pig" の場合、検索演算子に「MATCHES」を指定したら、有効な検索文字列は "dog cat pig" のみとなるべきです。

現在、スキーマではこのように定義しています:

managed-schema.xml: <dynamicField name="Zs*" type="text_general" indexed="true" stored="false" multiValued="true"/>
managed-schema.xml: <copyField source="Zs*" dest="_text_"/>

現在の挙動では、Description の内容が "dog pig cat" のときに、検索文字列として "dog pig" を指定しても、以下のような検索クエリでヒットが返ってきてしまいます:

http://host:8983/solr/solr1/select?q=(ZsDocumentDescription:"dog pig")

これは、Solr が属性内に検索文字列が含まれているかを見ているだけであり、完全一致ではありません。


質問:
検索文字列が属性の内容全体と完全に一致するかどうかを指定するクエリ構文はありますか?

Henry Farmerie

返信投稿者:ks-solruserml-bot (2025/04/30 11:44 投稿)

こんにちは、Henry。

あなたの例は StrField の一致(マッチ)に見えます。
まずは、StrFieldTextField の違いを確認してみてください。

もし、テキストフィールドを使いながらも全体一致をさせたい場合は、以下のような方法が考えられます:

  • トークンの境界を使ってフレーズクエリで検索する方法
     例: "BEGIN dog cat pig END" という形で検索

  • Lucene の CoveringQuery を Solr のパーサーに組み込んだカスタムコード
     (加えて、トークンの数を考慮するような実装)

  • または、ちょっとトリッキーな Solr 構文を使って次のように実現できるかもしれません:

  range(sum(dog^=1 cat^=1 pig^=1, 3, 3) AND "dog cat pig")  

 → これは、スコアの合計がちょうど3(=3つの語がすべて含まれている)であり、かつ "dog cat pig" のフレーズ一致があるもの、という条件を意味しています。

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/04/30 11:44 投稿)

copyField を使って、対象のフィールドの値を type="string" のフィールドにコピーすることで、インデックス時に対応できます。
検索時にはその string 型フィールドを使えば、完全一致(大文字・小文字も一致)で検索できます。

Mikhail が言ったように、string フィールドタイプは完全一致にしかマッチしません

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?