0

Webサイトの検索にapachesolrを使用しています。ネストされたエンティティを使用して、さまざまなテーブルからデータをインポートしています。データインポートは成功し、すべてのドキュメントがインデックスに追加されています。私のdataConfigは次のようになります:

<dataConfig>
  <dataSource type="JdbcDataSource" driver ="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/purplle_purplle2" user="purplle_purplle" password="purplle123" />

  <document name="doc">
     <entity name="offer" query="SELECT * FROM service_offering WHERE module LIKE 'location' ">

       <field column="name" name="name"/>
       <field column="id" name="id" />
       <field column="type_id" name="type_id" />

       <entity name="offer_type" query=" select name from service_offeringtype where id='${offer.type_id}'" >
          <field column="name" name="offer_type" />
       </entity>

       <entity name="offer_location" query=" select name from service_location where id='${offer.module_id}'" >
          <field column="name" name="location_name" />
       </entity>

       <entity name="offer_address" query=" select * from service_address where module_id='${offer.module_id}' AND module LIKE 'location'" >

          <entity name="loc_city" query=" select name from loc_city where id='${offer_address.city}'" >
            <field column="name" name="loc_city" />
          </entity>

          <entity name="loc_area" query=" select name from loc_area where id='${offer_address.area}'" >
            <field column="name" name="loc_area" />
          </entity>

          <entity name="loc_zone" query=" select name from loc_zone where id='${offer_address.zone}'" >
            <field column="name" name="loc_zone" />
          </entity>

       </entity>

    </entity>

  </document>

</dataConfig>

ここで、このインデックスを直接検索するとします。結果は「名前」フィールドに対してのみフェッチされます。他のフィールド、つまり「loc_area」、「location_name」、「loc_city」などにはnullを返します。私のスキーマは次のようになります。

<field name="id"  type="int" indexed="true" stored="true" /> 
<field name="name"  type="string" indexed="true" stored="true" />  
<field name="offer_type"  type="string" indexed="true" stored="true" />
<field name="location_name"  type="string" indexed="true" stored="true" />
<field name="type_id"  type="string" indexed="true" stored="true" />     
<field name="loc_city"  type="string" indexed="true" stored="true" /> 
<field name="loc_area"  type="string" indexed="true" stored="true" /> 
<field name="loc_zone"  type="string" indexed="true" stored="true" /> 

ただし、これらのフィールドを「テキスト」フィールドにコピーすると、デフォルトでschema.xmlに存在します。次に、「テキスト」フィールドを検索することで、関連する結果を簡単に取得できます。

<copyField source="name" dest="text"/>
<copyField source="offer_type" dest="text"/>
<copyField source="location_name" dest="text"/>
<copyField source="loc_city" dest="text"/>
<copyField source="loc_area" dest="text"/>
<copyField source="loc_zone" dest="text"/>

しかし、スコアを計算するためにさまざまなフィールドにブーストレベルを割り当てる必要があるため、このように行うことはできません。これをクエリ構文"&defType = edismax&qf = name ^ 1.0 + location_name ^ 10.0 + loc_area ^ 50.0"に追加すると、nullの結果が返されます。

なにが問題ですか?

4

1 に答える 1

1

私の推測では、あなたの問題はフィールドのタイプです。フィールドに何が含まれているか正確にはわかりませんが、 と の間には違いがtype="string"ありtype = "text"ます。

String 型は、フィールド入力全体のトークン化されていない String 値にインデックスを付けます。テキスト型は、フィールドをトークン化して分析します。たとえば、"John Smith" を含む文字列フィールドに対して "john" を検索すると、ヒットは期待できませんが、フィールドがテキスト フィールドの場合はヒットします。

クエリは文字列フィールドではなくテキスト フィールドに対して機能するように見えるため、型を変更してインデックスを再作成することが解決策のようです。

于 2013-01-21T18:32:31.887 に答える