mysql - DIH Mysql 到 Solr 导入问题

标签 mysql jdbc solr

我在将文档从 Mysql 索引到 Solr 时遇到问题。

我的配置:
数据配置.xml

<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://xxx?characterEncoding=utf8"
user="xxx"
password="xxx"/>

<document name="articledata">
    <entity name="outer"
transformer="HTMLStripTransformer"
query="SELECT
id,kundenid,LOWER(title) as title,LOWER(content) as content,
DATE_FORMAT(cr,'%Y-%m-%dT%H:%i:%sZ') as cr,
lang
FROM articledata
WHERE 
DATE(cr) BETWEEN DATE(DATE_SUB(now(),INTERVAL 3 DAY)) AND DATE(now())
AND content IS NOT NULL
ORDER BY DATE(cr) DESC">



      <field column="id" name="id" />
         <field column="kundenid" name="kundenid" />
            <field column="title" name="title" />
            <field column="content" name="content" stripHTML="true" />
         <field column="cr" name="cr" />
         <field column="lang" name="lang" />
        </entity>
    </document>
</dataConfig>

架构.xml

    <?xml version="1.0" ?>
    <schema name="articledata core zero" version="1.1">
      <types>
    <fieldtype name="int"  class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>   
    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>   
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="dt" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" />

    <fieldType name="textgen" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>

  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

  </types>

 <fields>   
  <field name="id"        type="int"    indexed="true"   stored="true"   required="true"/>
  <field name="kundenid"  type="int"    indexed="true"   stored="true"   required="true"/>
  <field name="title"     type="string"   indexed="true"   stored="true"   /> 
  <field name="content"   type="textgen"    indexed="true"  stored="true"  />
  <field name="cr"       type="dt"   indexed="true"  stored="true" /> 
  <field name="lang"      type="string"    indexed="true"  stored="true" /> 
  <field name="_version_" type="long"      indexed="true"  stored="true"/>
 </fields>

 <uniqueKey>id</uniqueKey>
 <defaultSearchField>content</defaultSearchField>

 <solrQueryParser defaultOperator="AND"/>

</schema>

通过此配置,我得到如下文档:

"docs": [
      {
        "content": "[B@7f017c71",
        "id": 20785923,
        "cr": "2014-07-24T08:01:58Z",
        "title": "general motors entdeckt neue mängel bei hunderttausenden wagen - news - alle aktuellen news - dpa-afx - general motors dl-,01 - onvista",
        "kundenid": 1,
        "_version_": 1474502436614832000
      },

标题已正确索引

内容显示为废话字符并且不可搜索。

有什么办法可以解决这个问题吗?

提前致谢。

最佳答案

我怀疑数据库中的内容字段必须是text/BLOB而不是varchar(因为标题必须是varchar)。因此,您能够正确索引标题,但内容未正确索引。

如果数据库中有 BLOB 数据或文本数据,那么使用具有正确的分词器、分析器和过滤器集的字段类型可能会很有用。

例如,添加 StandardTokenizerFactory 可以将 token 保持为有意义的值集。

字段类型定义的示例:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldtype>

如果问题仍然存在,那么以下信息将帮助您调查此问题:

1) 可以检查运行查询时从 MYSQL 获得的值: SELECT id,kundenid,LOWER(title) as title,LOWER(content) as content, DATE_FORMAT(cr,'%Y-%m-%dT %H:%i:%sZ') as cr,lang FROMarticledata WHERE DATE(cr) BETWEEN DATE(DATE_SUB(now(),INTERVAL 3 DAY)) AND DATE(now()) AND content IS NOT NULL ORDER BY DATE (cr) DESC"

2) 尝试将 textgen 更改为字符串。

3) 尝试从内容中删除 stripHTML="true"

希望这将帮助您解决问题,或者至少帮助您进一步调查。

关于mysql - DIH Mysql 到 Solr 导入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24930726/

相关文章:

python-2.7 - 无法使用 python 和请求发布到 solr 服务器

php - 为什么 Magento 在生成 ID 后无法保存客户?

php - 使用 AJAX 将变量传递给 Div

java - 使用 JDBC 连接 Android/MySQL

sql - java.lang.ClassCastException : com. mchange.v2.c3p0.impl.NewProxyConnection 问题

java - 如何在 spring data solr 中搜索关键字作为忽略大小写?

具有多个收件人表结构的 PHP/MySQL PM 系统?

mysql - 如何在 JMeter 中拆分和执行每个拆分值的 JDBC 插入 sql 查询

postgresql - 从 postgreSQL 读取 100M 行到 Spark 并写入 parquet

solr - Solr 中的可更新字段