2012-01-23 16 views
0

私の問題は次のとおりです。 私は、Solrでインデックスされた大きなユーザーセットを持っています。 Abac - Alac(この2人のファーストネームのXユーザー) Alex - Amar(この2人のfirstnames間のXユーザー) Atac - Azar(この2人の最初の名前のXユーザー)Solr:範囲の名前でクエリ

solrクエリで範囲を見つける方法は問題ですか?それはFIRSTNAMEを抽出する方法としても見ることができ

はアルファベット順に並べどこ結果順位モジュロX = 0

おかげ

+2

私の最初の考えは、ユーザーカウントでファセット名を取得してから、範囲をSolr外に構築することです。 –

+0

私はRob Di Marcoに同意します。 Solrのボックスフィーチャからはわかりませんが、これは等しい数でファセット範囲を解決できます。 (その逆数面の特徴のように、数を指定して範囲を取得する) – Omnaest

答えて

1

私はあなたがアルファベット範囲バケットを探していると思います。この機能をそのまま使用できる機能はSolrにはありません。しかし、あなたはテキスト解析の追加のステップで創造的なハックを使用することができます。これ以下は、あなたのケースで役立つこと

フィールドタイプを作成します。

<fieldType name="letterRangeFieldType" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="^([a-zA-Z]).*" group="1" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="letterRanges.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
</fieldType> 

は、そのフィールド型のフィールドを作成しますletterRangeFieldType:

<field name="firstNameFacetLetter" type="letterRangeFieldType" stored="false" /> 

作成コピーフィールドをその新しいフィールドにコピー最初の名前をバケット化する:

<copyField source="firstName" dest="firstNameFacetLetter" /> 

まとめて、 PatternTokenizerFactoryはファーストネームの最初の文字を取り、synonyms="letterRanges.txt"で定義された同義語の範囲の範囲ベースにマップします。たとえば、名前がFooの場合、D - Fにマッピングされます。

最後に、新しいフィールドでファセットを実行するには、ソートをlexオーダーで実行します。あなたは、そのようにあなたがあなたの範囲&要件に合わせてカスタマイズする必要が

<lst name="firstNameFacetLetter"> 
    <int name="A-C">99</int> 
    <int name="D-F">76</int> 
    <int name="G-I">52</int> 
    ... 

を結果が得られますが、これはあなたを助けるかもしれません。

+0

あなたの答えをありがとうございますが、私は問題があればそれが明確ではなかったと思います。私はAで始まるユーザーが多いです。結果を実際に分割したいのですが。私はAから始まるラストネームの検索を行う必要があります。そして、最初の結果、X番目の結果、Xth + 1の結果、2xX番目の結果などを取得したいと思います。私の質問で。 – KaipiYann

1

ここで説明している名前と表現をインデックスに保存します。インデックス作成の前にクライアント側で計算する必要がありますが、クライアント側の選択的な複製とデータの非正規化は、Solrウィングを与えるものです。今、あなたはあなたが「の間の検索」を行うことができます6桁の数値フィールドを持つ

Abu -- 01 02 21 
George -- 07 05 15 

は、各文字に対して2桁で名前の最初の3文字をエンコードします。 becoの間で検索する場合は、020500031500の間で検索してください。

これらの数値は、あくまでもレンジファセットに適しています。つまり、aからb、b、cなどに分割することができます。

一部のフィルタ:

[a,ae] needs bucket:[010000 TO 010500] 
[ae-b], 50 results from 100 needs bucket:[010500 TO 020000]&start=100&rows=50 
[b-c] needs bucket:[020000 TO 030000] 
[b-c], 4th result needs bucket:[020000 TO 030000]]&start=4&rows=1 
+0

あなたの答えをありがとうが、私は問題があれば私は明らかではなかったと思う。私はAで始まるユーザーが多いです。結果を実際に分割したいのですが。私はAから始まるラストネームの検索を行う必要があります。そして、最初の結果、X番目の結果、Xth + 1の結果、2xX番目の結果などを取得したいと思います。私の質問で。 – KaipiYann

+0

がクエリごとに更新されました – aitchnyu

1

mailboatの答えは、ほとんど私のために働くんでしたが、それは私のSolrの中でいくつかの微調整が必​​要:

型定義:

<fieldType name="vendorNameRangeFieldType" class="solr.TextField"> 
    <analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="vendorNameLetterRanges.txt" ignoreCase="true" expand="true"/> 
</analyzer> 
</fieldType> 

フィールド定義:

<field name="vendorNameFacetLetter" type="vendorNameRangeFieldType" indexed="true" stored="true" /> 

フィールドにコンテンツをコピーする:

<copyField source="Title_prop" dest="vendorNameFacetLetter" maxChars="1"/> 

そして、私の同義語ファイルの内容:

a,b,c,d => AD 
e,f,g,h => EH 
i,j,k,l => IL 
m,n,o,p => MP 
q,r,s,t => QT 
u,v,w,x,y,z => UZ 

これは、その後、(それが唯一の最初の文字だ使用)Title_propフィールドの内容から新しいフィールドを作成し、