2017-02-12 3 views
0

ファイルを抽出するときに、solrはそのコンテンツを_text_というキャッチオールフィールドにインデックスします。コンテンツフィールドにfmap.content=my_content_fieldを指定しても、このような場合があります。solrは "catch-all"フィールド_text_でどのように動作していますか?

フィールドが宣言されたfmap.contentがない場合、フィールド_text_は更新時に上書きされているようです。 fmap.contentが宣言された場合、フィールド_text_は明らかに変更されません。

この現象を再現するには、次の

SOLR_CORE=test 
SOLR_URL=http://192.168.45.153:8983/solr/${SOLR_CORE} 
FILENAME=textfile.txt 

cat > ${FILENAME} << EOF 
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, 
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
EOF 

curl "${SOLR_URL}/update?commit=true&stream.body=<delete><query>*:*</query></delete>" 

は、ファイル名.txtの内容の文書、抽出およびインデックスを追加コア内のすべての文書を削除します。

curl "${SOLR_URL}/update/extract?\ 
literal.id=${FILENAME}\ 
&fmap.content=my_content_field\ 
&literal.field_x=initial_text_of_field_x\ 
&literal.field_y=initial_text_of_field_y\ 
&commit=true"\ 
-F "[email protected]${FILENAME}" 

ipsumという語を含む文書を照会します。

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id" 

更新フィールドfield_xの内容:

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id" 

クエリの前に、予想されるとして発見文書で結果を与える更新した後:単語ipsumを含むドキュメントのクエリー

curl "${SOLR_URL}/update?commit=true" -d ' 
[ 
    { 
    "id" : '${FILENAME}', 
    "field_x" : {"set" : "new_value"} 
    } 
]' 

{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"_text_:ipsum", 
     "fl":"id"}}, 
    "response":{"numFound":1,"start":0,"docs":[ 
     { 
     "id":"textfile.txt"}] 
    }} 

文書が&fmap.content=my_content_fieldずに追加された場合:(上記参照)を更​​新した後

curl "${SOLR_URL}/update/extract?\ 
literal.id=${FILENAME}\ 
&literal.field_x=initial_text_of_field_x\ 
&literal.field_y=initial_text_of_field_y\ 
&commit=true"\ 
-F "[email protected]${FILENAME}" 

クエリには書類が見つからない:

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"_text_:ipsum", 
     "fl":"id"}}, 
    "response":{"numFound":0,"start":0,"docs":[] 
    }} 

答えて

0

ここでの主な問題は、更新コマンドが持っているということですドキュメントを再構築し、更新してLuceneストレージレイヤに戻してください。これは、Luceneレベルでは、内容が書き込み専用であるためです。 Solrレベルの更新は、実際には新しいLuceneドキュメントをカバーの下に生成します。

したがって、ドキュメントを再構築するには、フィールドを元に戻す必要があります。フィールドが格納されていない場合(または、私が思うと、docValued)、そうする方法はありません。それは通常、便利なデフォルトの検索のための他の多くの分野のコンテンツを蓄積して

テキストフィールド

は、保存されていない可能性が高いです。したがって、再構成には関与せず、更新された文書はそれを逃します。

私の推測では、my_content_field格納され=真で定義され、したがって、再構成された文書に含まれることができ、更新バック一緒に保存することです。

関連する問題