0

問題は次のとおりです。たとえば、「Иван Кирилов Петров」、「Нина Семова Мариножа」などの名前で構成される列 (name という名前) があります。

そこで、名前が 'Иван' で姓が 'Петров' であるすべての名前を取得するクエリを作成したいと思います。2 番目の名前は関係ないので、*ワイルドカード文字を入れます。

さらに大きな問題があります。ユーザーが「Иван Кирилов Петров」と書いた場合、この正確な人物を見つけることができるはずです。

私が試したこと:

フィールドtext_wsタイプを作成し、次のクエリをテストしました。

q=name:Иван*Петров

パーフェクト - それは私が欲しいものを見つけます - 最初Иванと最後の名前を持つすべての名前Петров;

しかし、次に Иван Кирилов Петров を見つけたいのですが、正確な検索を行いたいのですが、タイプは文字列でなければならないため、応答がありません

どうすればこれを解決できますか!

4

2 に答える 2

0

ワイルドカード クエリは必要ないと思います。インデックス時間中 ( ) に空白のみを分割しtext_ws、クエリの完全な姓、名、および/またはミドル ネームを取得する場合は、次のような AND クエリを実行できます。

q=name:(Иван AND Петров)

また

q=name:(ИВАН AND МИНЧЕВ AND ПЕТРОВ)

更新: あなたのコメントの後、これは単語の袋の検索を行い、順序を保持しないことがわかりました。たとえばの文字列コピー フィールドを保持する必要があると思います。これにより、より多くの検索オプションが得られます。たとえば、クエリに 2 つのスペースがある場合、つまり姓、名、ミドル ネームを取得する場合、likeで完全一致を実行できます。namename_strname_str

q=name_str:"ИВАН%20МИНЧЕВ%20ПЕТРОВ"

Solr 4.0 以降を使用している場合は、文字列フィールドに対する正規表現クエリが役立ちます。できるよ

q=name_str:/ИВАН.*ПЕТРОВ/

で始まり、ИВАНで終わるものすべてに一致しПЕТРОВます。

あるいは

q=name_str:/Иван.*?Кирилов.*?Петров/

残念ながら、正規表現検索に関する Solr wiki ページはまだありませんが、ググることはできます。

実行するさまざまなタイプのクエリを区別し、さまざまな検索を実行する必要があります。完全一致が必要かどうかを尋ねるチェックボックスをユーザーに提供することもできます。

于 2013-02-19T18:28:11.580 に答える
0

text_ws タイプ定義にautoGeneratePhraseQueries="true"フラグを追加してみてください。そして debugQuery=true フラグを使用して、フィールドに対してどのように一致するかを確認します。基本的なことが機能する場合は、eDismax 構成の pf3 フラグを調べて、クエリの一致を高めることができます。

Solr にはロシア語専用のトークン フィルターも付属していますが、人々の名前については気にしないでしょう。

于 2013-02-19T11:25:14.803 に答える