Most of us when implementing the Search for the Site , the
data we are going to process is not from the Same Table and same fields , for
information on how to Index the Data From Database can be seen in my previous
blog here. This deals only with data from multiple datasources or the data from
different tables here.
Navigate to db-data-config .xml and edit it. I am going to
setup the Customer Data for Search here.
<?xml version="1.0" encoding="UTF-8"
?>
<dataConfig>
<dataSource name="ds1"
type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/classicmodels" user="root"
password="root"/>
<dataSource name="ds2"
type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/customerdata" user="root"
password="root"/>
Here is the place where, I can define the different datasources . Here I have configured two types of datasources, one is called ds1 and
another called as ds2. You can have different Set like hsql and XML also
defined for processing.
<document>
<entity
name="products" dataSource="ds1" pk="id"
query="select * from products" deltaImportQuery="select * from
products"
deltaQuery="select * from products where last_modified >
'${dataimporter.last_index_time}'">
<field
column="productCode" name="id"/>
<field
column="productName" name="name"/>
<field
column="productDescription" name="description"/>
<field column="productLine"
name="category"/>
</entity>
In the products entity, unique key is the id and we can
mention the data source also here.
<entity name="customers"
dataSource="ds2"
pk="customerNumber" query="select * from customers"
deltaImportQuery="select * from customers"
deltaQuery="select * from customers where last_modified >
'${dataimporter.last_index_time}'">
<field
column="customerNumber" name="id"/>
<field
column="customerName" name="customerName"/>
<field
column="contactLastName" name="contactLastName"/>
<field column="contactFirstName"
name="contactFirstName"/>
<field column="phone"
name="phone"/>
<field column="addressLine1"
name="addressLine1"/>
<field column="addressLine2"
name="addressLine2"/>
<field column="city"
name="city"/>
<field column="state"
name="state"/>
<field column="postalCode"
name="postalCode"/>
<field column="country"
name="country"/>
<field
column="salesRepEmployeeNumber" name="salesRepEmployeeNumber"/>
<field column="creditLimit"
name="creditLimit"/>
</entity>
</document>
</dataConfig>
If you are introducing the new entity it is must to have
field called the id , which is used for the uniqueness of the records.
Querying for products
Querying for customers
df is the data fields that holds this indexed data. Refrence
is the datafield for products and customer is the datafield for customers.
Errors:
2017-04-22 10:24:17.256 WARN
(Thread-14) [ x:refrence]
o.a.s.h.d.SolrWriter Error creating document : SolrInputDocument(fields:
[category=Ships, id=S72_3212, name=Pont Yacht, description=Measures 38 inches
Long x 33 3/4 inches High. Includes a stand.
Many extras including rigging, long boats, pilot house,
anchors, etc. Comes with 2 masts, all square-rigged,
_version_=1565373662235721728])
org.apache.solr.common.SolrException: [doc=S72_3212] missing
required field: city
When you face the error you have to remove the field
required=”true ” or make it “false” in managed-schema.xml as like below
<field
name="city" type="string" indexed="true"
stored="true" required="false"
multiValued="false" />
<field name="city" type="string"
indexed="true" stored="true" multiValued="false"
/>
If you face below error
Solr Error Document is missing mandatory uniqueKey field
id
It means your document does not have the property id which
is defined like below in <uniqueKey>id</uniqueKey> in managed-schema.xml
Happy learning !!!!