1

以下の質問:

SOLR のデータ構造:

<field name="id" type="string" required="true"/> 
<field name="session_id" type="string" required="true"/> 
<field name="action_type" required="true"/> 
<field name="error_msg" required="false"/>

(すべてのフィールドは次のとおりです: indexed="true" stored="true" multiValued="false") 'error' フィールドのみが必須ではありません (null にすることができます)。

Oracleには同等のテーブルがあります:

TABLE SOLR_TEST
  (
    ID          NUMBER NOT NULL ,
    SESSION_ID  VARCHAR2(20 BYTE) NOT NULL ,
    ACTION_TYPE VARCHAR2(20 BYTE) NOT NULL ,
    ERROR_MSG   VARCHAR2(20 BYTE)
  );

サンプルデータあり(SOLR、Oracleも同様)

ID SESSION_ID           ACTION_TYPE          ERROR_MSG          
-- -------------------- -------------------- --------------------
 1 00001                SELECTED_ACTION                           
 2 00001                SELECTED_ACTION                           
 3 00001                OTHER                                     
 4 00002                A2                   ERROR_001            
 5 00002                OTHER                                     
 6 00003                SELECTED_ACTION      ERROR_002            
 7 00004                A1                   ERROR_001            
 8 00005                A2                                        
 9 00005                SELECTED_ACTION                           
10 00005                SELECTED_ACTION      ERROR_003            
11 00006                SELECTED_ACTION                           
12 00006                OTHER                ERROR_004            

質問:

返されるSOLRクエリで作成する方法:session_id指定されaction_typeたが決して起こらないすべてがaction_type空以外で指定されたerror_msg

または Oracle での次のクエリに相当します。

select distinct session_id 
    from SOLR_TEST 
    where action_type='SELECTED_ACTION' 
    and not session_id in 
      ( select session_id 
        from SOLR_TEST 
        where action_type='SELECTED_ACTION' 
              and error_msg is not null
      );

このクエリの結果は次のとおりです。

SESSION_ID         
--------------------
00001                
00006                

たとえば、次のような SOLR クエリは機能しません

http://solrhost/solr/collection/select?rows=1&q=-(error_msg:[*+TO+*]+AND+action_type:SELECTED_ACTION)&wt=xml&indent=true&facet=true&facet.field=session_id&facet.zeros=false&fq=action_type:SELECTED_ACTION

// 編集 /////////////////////////////////////

実際のスキーマは次のようになります。

<schema name="elogging" version="1.5">
  <fields>
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
    <field name="action_type" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
    <field name="session_id" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
    <field name="error_msg" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
    <field name="_version_" type="long" indexed="true" stored="true"/>
  </fields>
  <uniqueKey>id</uniqueKey>
  <types>
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="uuid" class="solr.UUIDField" indexed="true"/>
  </types>
  <updateRequestProcessorChain name="uniq-fields">
    <processor class="org.apache.solr.update.processor.UniqFieldsUpdateProcessorFactory">
      <lst name="fields">
        <str>id</str>
      </lst>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory"/>
  </updateRequestProcessorChain>
</schema>

// 編集 2 //////////////////////

SOLR クエリが期待どおりに機能しない - この SOLR クエリは次のようなものを返します。

select distinct session_id 
from SOLR_TEST 
where action_type='SELECTED_ACTION' 
and error_msg is null;

SESSION_ID         
--------------------
00001                
00005                
00006

次の行があるため、値 '00005' は正しくありません:

10 00005                SELECTED_ACTION      ERROR_003            

// 編集 3 ////////////

このSOLRクエリも機能しません(前と同じ問題):

http://solrhost/solr/collection/select?rows=1&q=action_type:SELECTED_ACTION+AND+-{!join+from=session_id+to=session_id}error_msg:*+AND+action_type:SELECTED_ACTION&wt=xml&indent=true&facet=true&facet.field=session_id&facet.zeros=false

// 編集 4 ///////

*スキーマを修正 - 'error_msg' のインデックスが作成されました*

// 編集 5 /////

SOLR のサンプル データがあります。

id,session_id,action_type,error_msg
1,00001,SELECTED_ACTION,
2,00001,SELECTED_ACTION,
3,00001,OTHER,
4,00002,A2,ERROR_001
5,00002,OTHER,
6,00003,SELECTED_ACTION,ERROR_002
7,00004,A1,ERROR_001
8,00005,A2,
9,00005,SELECTED_ACTION,
10,00005,SELECTED_ACTION,ERROR_003
11,00006,SELECTED_ACTION,
12,00006,OTHER,ERROR_004

このデータとクエリの SOLR からの結果http://localhost:8983/solr/collection3/select?rows=1&q=-(error_msg:[*+TO+*]+AND+action_type:SELECTED_ACTION)&wt=xml&indent=true&facet=true&facet.field=session_id&facet.zeros=false&fq=action_type:SELECTED_ACTION:

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">30</int>
<lst name="params">
<str name="facet.zeros">false</str>
<str name="facet">true</str>
<str name="indent">true</str>
<str name="q">
-(error_msg:[* TO *] AND action_type:SELECTED_ACTION)
</str>
<str name="facet.field">session_id</str>
<str name="wt">xml</str>
<str name="fq">action_type:SELECTED_ACTION</str>
<str name="rows">1</str>
</lst>
</lst>
<result name="response" numFound="4" start="0">
<doc>
<str name="id">1</str>
<str name="session_id">00001</str>
<str name="action_type">SELECTED_ACTION</str>
<long name="_version_">1449881246216749056</long>
</doc>
</result>
<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="session_id">
<int name="00001">2</int>
<int name="00005">1</int>
<int name="00006">1</int>
</lst>
</lst>
<lst name="facet_dates"/>
<lst name="facet_ranges"/>
</lst>
</response>
4

1 に答える 1

1

私が知る限り (そして、誰かがこれが間違っていることを証明できれば非常にうれしいです) 、別のクエリ (フィルター クエリやネストされたクエリなど) でクエリ結果の一部を再利用することはできないため、これはちょっと注意が必要です。

だから、ここに私が現在得ることができる限り近いものがあります:

クエリ:

http://localhost:8983/solr/stack19588325/select?q=action_type%3A%22SELECTED_ACTION%22&fq=%7B!tag%3Ddt%7Daction_type%3ASELECTED_ACTION+AND+error_msg%3A%5B*+TO+*%5D+AND+_query_%3A%7B!join+from%3Dsession_id+to%3Dsession_id+v%3D%24qq%7D&rows=0&wt=xml&indent=true&facet=true&facet.mincount=1&facet.field={!ex=dt%20key=nonfilter_session_id}session_id&facet.field=session_id&qq=-error_msg:[*%20TO%20*]

結果:

<response>    
<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">0</int>
  <lst name="params">
    <str name="qq">-error_msg:[* TO *]</str>
    <str name="q">action_type:"SELECTED_ACTION"</str>
    <arr name="facet.field">
      <str>{!ex=dt key=nonfilter_session_id}session_id</str>
      <str>session_id</str>
    </arr>
    <str name="indent">true</str>
    <str name="fq">{!tag=dt}action_type:SELECTED_ACTION AND error_msg:[* TO *] AND _query_:{!join from=session_id to=session_id v=$qq}</str>
    <str name="facet.mincount">1</str>
    <str name="rows">0</str>
    <str name="wt">xml</str>
    <str name="facet">true</str>
    <str name="_">1382878844535</str>
  </lst>
</lst>
<result name="response" numFound="1" start="0">
</result>
<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields">
    <lst name="nonfilter_session_id">
      <int name="00001">2</int>
      <int name="00005">2</int>
      <int name="00003">1</int>
      <int name="00006">1</int>
    </lst>
    <lst name="session_id">
      <int name="00005">1</int>
    </lst>
  </lst>
  <lst name="facet_dates"/>
  <lst name="facet_ranges"/>
</lst>
</response>

したがって、ここに示すように、2 つの異なるファセット結果があります。

  • nonfilter_session_id - これは、error_msg を持たない「session_id」を示します。count - session_id レコードの総数です。
  • session_id - これは、両方とも error_msg を持っていない "session_id" を示します (これは 00005 の場合です)。カウント - session_id と error_msg のカウントです。

したがって、これ以上の選択肢がない場合は、これら 2 つのセットを交差させることができ、期待される session_id のみが存在します。

于 2013-10-27T11:53:09.133 に答える