Обрабатывать несколько таблиц MySQL с помощью Solr 5.1.0?

У меня есть более 30 таблиц в моей базе данных MySQL. Недавно я импортировал данные из моей 1 таблицы в Solr 5.1.0, используя DataImporthandler и в моем файле data-config.xml, запрос на запуск,

select * from table-name

Но в моем поиске мне нужно объединить более 10 таблиц, чтобы получить правильный результат поиска.

Способы сделать это

1) Импортировать данные с помощью JOIN- запроса в базу данных MySQL и импортировать их

ИЛИ ЖЕ

2) ПРИСОЕДИНЯЙТЕСЬ к решающим задачам, импортируя полные данные отдельных таблиц.

Что я должен сделать, чтобы оптимизировать?? и какой хороший способ?

2 ответа

Решение
  1. Чтобы импортировать данные, используя запрос JOIN в базе данных MySQL и импортировать их

    Да, это возможно в Solr с использованием DIH. С DIH, как вы должны настроить свой data-config.xml. Здесь вы можете написать запрос, используя соединения, которые будут извлекать данные из всех желаемых таблиц. Здесь вы можете создать одно ядро ​​и иметь все данные в одном ядре. Вы можете создать свой документ, используя эти поля. (Поля документов будут упомянуты в schema.xml).

    Точки, которые следует учитывать при оптимизации, - это то, по каким полям вы хотите искать и хотите показать в результате. Так что сначала нужно разобраться с этим. По каким полям вы будете искать и нужно отобразить.

    Поля, по которым вам нужно выполнить поиск, обозначают их как indexed = "true". Остальные все делают как indexed = "false". Поля, которые вам нужны в результате, помечают их как сохраненные = "истина". Остальные все делают как сохраненные = "ложь".

    Некоторым может потребоваться как то и другое, например поиск и показ в результате. Отметьте их как indexed = "true" и сохраненные = "true".

    например, в моем документе было 15 полей, но только 4 проиндексированы, так как я хочу искать только по этим полям. а остальные все поля показываются в результате, поэтому там хранятся.

    Теперь перейдем ко второму вопросу

    ПРИСОЕДИНЯЙТЕСЬ к решениям ядер, импортируя полные данные отдельных таблиц. Да, это возможно в Solr начиная с Solr 4.0

    подробный пример можно найти по ссылке ниже https://wiki.apache.org/solr/Join

    Но также учитывайте ограничения этого.

  2. Поля или другие свойства документов, к которым присоединяются "из", недоступны для использования при обработке результирующего набора документов "до" (т. Е. Вы не можете вернуть поля в документах "из", как если бы они были многозначным полем в "до" документов).

    Таким образом, вы можете рассмотреть эти моменты, прежде чем принять окончательный звонок.

Рассмотрим здесь у вас есть два ядра

core brands with fields {id,name}
core products with fields{id, name, brand_id}

data in core BRANDS: {1, Apple}, {2, Samsung}, {3, HTC}

data in core PRODUCTS: {1, iPhone, 1}, {2, iPad, 1}, {3, Galaxy S3, 2}, {4, Galaxy Note, 2}, {5, One X, 3}

вы бы построили свой запрос как:

http://example.com:8999/solr/brands/select?q=*:*&fq={!join from=brand_id to=id fromIndex=products}name:iPad

and the Result will be: {id: "1", name:"Apple"}
  1. В среде DistributedSearch нельзя объединять ядра на нескольких узлах. Однако, если у вас есть индивидуальный подход к разделению, вы можете объединить несколько ядер на одном узле.

  2. Запрос на соединение создает постоянные оценки для всех документов, которые соответствуют - оценки, вычисленные по вложенному запросу для документов "от", недоступны для использования при оценке документов "до".

    Учитывая вышеизложенное, я надеюсь, что вы сможете решить, какой подход вы хотите использовать.

Если у вас одно ядро, я бы порекомендовал импортировать таблицы в одно ядро ​​и использовать соединения. Это то, что я сделал на моем solr 4.9 с помощью торт php и solrphpclient. Но для этого вам нужно будет определить структуру таблицы и типы данных в data-config.xml и schema.xml.Which, я полагаю, вы должны были это сделать. В вашем файле data-config вы пишете запросы или определяете структуру, которая будет импортировать все данные из ваших десяти таблиц соответственно

Смотрите мой пример для двух таблиц

 <entity name="type_masters" pk="type_id" query="SELECT delete_status as   
 type_masters_delete_status,type_updated,type_id,category_id,type_name FROM   
 type_masters
where type_id='${businessmasters.Business_Type}'"
deltaQuery="select type_id from type_masters where type_updated > 
'${dih.last_index_time}'"
parentDeltaQuery="select business_id from businessmasters where 
Business_Type=${type_masters.type_id}"> 
 <field column="type_id" name="id"/>   
 <field column="category_id" name="category_id" indexed="true" stored="true"   
/>
  <field column="type_name" name="type_name" indexed="true" stored="true" />

       <field column="type_updated" name="type_updated" indexed="true" 
stored="true" />
<field column="type_masters_delete_status" name="type_masters_delete_status" 
indexed="true" stored="true" />


<entity name="category_masters" query="SELECT delete_status as 
category_masters_delete_status,category_updated,category_id,category_name 
FROM category_masters where category_id='${type_masters.category_id}'"

   deltaQuery="select category_id from category_masters where category_updated > '${dih.last_index_time}'"

  parentDeltaQuery="select type_id from type_masters where 
  category_id=${category_masters.category_id}"> 

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

  <field column="category_name" name="category_name" indexed="true"    
    stored="true" />
    <field column="category_updated" name="category_updated" indexed="true" 
   stored="true" />
             <field column="category_masters_delete_status" 
     name="category_masters_delete_status" indexed="true" stored="true" />
           </entity><!-- category_masters -->

      </entity><!-- type_masters -->
Другие вопросы по тегам