Отображение элементов с несколькими строками из mysql в solr


Итак, у меня есть нормализованная таблица с некоторыми данными, которые я хочу поместить в индекс Solr, что-то вроде этого

+----+--------------+--------------+---------+
| id |     name     |  attribute   | value   |
+----+--------------+--------------+---------+
|  1 | Apple        | color        | green   |
|  1 | Apple        | shape        | round   |
|  1 | Apple        | origin       | Belgium |
|  2 | Motorbike    | type         | fast    |
|  2 | Motorbike    | nr of wheels | 2       |
|  3 | Office chair | color        | grayish |
|  3 | Office chair | spins        | yes     |
+----+--------------+--------------+---------+

Теперь я бы предпочел, чтобы он индексировался как один документ на уникальный идентификатор (т. е. элемент). Но тогда мне придется объединить n атрибутов в один документ. Чтобы сделать это, мне нужно было бы сделать некоторую магию с моим dataConfig. Но как я могу хранить и отображать n полей? Сейчас подходящее время для использования динамических полей?

Вот моя текущая попытка. Я почти уверен, что это не так. действительный.

<dataConfig>
    <dataSource 
        type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/mystuff"
        user="root" password="*****"/>

    <document name="doc">
        <entity name="t1" query="select * from item_to_id_table">
            <field name="id" column="id"/>
            <field name="name" column="name"/>
            <entity name="t2" query="select * from my_flat_table" 
                    cacheKey="t1.id"
                    cacheLookup="t2.id">

                <!-- alt 1 -->
                <field name="$(t2.attribute)" column="value" />
                <!-- alt 2 -->
                <entity name="properties" query="select property, value from t2" 
                        cacheKey="$(t2.attribute)"
                        cacheLookup="property">
                    <field name="$(properties.property)" column="value" />
                </entity>
            </entity>
        </entity>

    </document>
</dataConfig>
Я почти уверен, что ни один из этих двух вариантов не является действительным, я попробую их в ближайшее время, если не смогу придумать что-то получше. Возможно, преобразование сценария в качестве третьей альтернативы.

Является ли этот вариант использования разумным для использования с Solr?

1   4   2012-10-23 12:47:41

1 ответ:

Я решил это способом, описанным здесь.

Короче говоря, я использовал преобразование скрипта, чтобы превратить строки сущности 'properties' в поля с префиксом "p_". Примерно так (пример кода, могут быть ошибки):

<dataConfig>
    <dataSource 
        type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/mystuff"
        user="root" password="*****"/>

    <script>
    <![CDATA[ 
    function formProperty(row) { 
      var propName = row.get("property");
      var propVal = row.get("value");
      var fieldName = "p_" + propName;
      row.put(fieldName,propVal);
      return row; 
    } 
    ]]>
    </script> 

    <document name="doc">
        <entity name="t1" query="select * from item_to_id_table">
            <field name="id" column="id"/>
            <field name="name" column="name"/>
            <entity name="t2" 
                    query="select * from my_flat_table
                    where my_flat_table.id = ${t1.id}"
                    transformer="script:formProperty">
            </entity>
        </entity>
    </document>
</dataConfig>

Затем я сопоставил их в схему solr в schema.xml как динамические поля

<dynamicField name="p_*" indexed="true" stored="true" type="string"/>