如何在 solr 中 运行 一个 sql 查询
How to run a sql query in solr
好的,现在我已经成功安装了 solr 和索引数据库,结构如下:DB_NAME - solr,Table - users
我的数据库数据-config.xml 文件:
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="" />
<document>
<entity name="users" query="select id,name from users;" />
<field column="ID" name="id" />
<field column="NAME" name="name" />
</document>
</dataConfig>
数据库 table 用户的第 returns 行。
问题 1 :
但是如果我想像 'Rakesh Shetty' 那样搜索并且它应该 return 结果 "Rakesh Vasant Shetty" 我该怎么办?
我试过 <entity name="users" query="select id,name from users where name like '%Rakesh Shetty%' ;" />
但是 return 结果是空的。
问题 2 :
另外,我怎样才能使这个搜索查询动态化?我的意思是会有一个带有搜索文本框的表单,它应该查询 solr?我正在使用 php 和 solr 5.1.0.
提前致谢。
参考:SOLR DIH USING CUSTOM VARIABLES
所以基本上你需要将自定义变量传递给你的 DIH.xml 文件,比如
http://localhost:8983/solr/{collection_name}/dataimport?command=full-import&name=Rakesh&commit=true
并且在 DIH 文件中,您可以使用 ${dataimporter.request.name}
访问此变量,并在您的 DIH 查询中使用。
例如,
<entity name="users" query="select id,name from users where name ='${dataimporter.request.name}' ;" />
对于您的动态搜索,请参阅下面的link
尝试使用以下架构。
<schema name="simple" version="1.5">
<types>
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" preserveOriginal="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
</types>
<fields>
<field name='id' type='int' required='true' indexed="true" stored="true"/>
<field name='name' type='text' required='true' indexed="true" stored="true"/>
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>name</defaultSearchField>
<solrQueryParser defaultOperator='OR' />
</schema>
好的,现在我已经成功安装了 solr 和索引数据库,结构如下:DB_NAME - solr,Table - users
我的数据库数据-config.xml 文件:
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="" />
<document>
<entity name="users" query="select id,name from users;" />
<field column="ID" name="id" />
<field column="NAME" name="name" />
</document>
</dataConfig>
数据库 table 用户的第 returns 行。
问题 1 :
但是如果我想像 'Rakesh Shetty' 那样搜索并且它应该 return 结果 "Rakesh Vasant Shetty" 我该怎么办?
我试过 <entity name="users" query="select id,name from users where name like '%Rakesh Shetty%' ;" />
但是 return 结果是空的。
问题 2 :
另外,我怎样才能使这个搜索查询动态化?我的意思是会有一个带有搜索文本框的表单,它应该查询 solr?我正在使用 php 和 solr 5.1.0.
提前致谢。
参考:SOLR DIH USING CUSTOM VARIABLES
所以基本上你需要将自定义变量传递给你的 DIH.xml 文件,比如
http://localhost:8983/solr/{collection_name}/dataimport?command=full-import&name=Rakesh&commit=true
并且在 DIH 文件中,您可以使用 ${dataimporter.request.name}
访问此变量,并在您的 DIH 查询中使用。
例如,
<entity name="users" query="select id,name from users where name ='${dataimporter.request.name}' ;" />
对于您的动态搜索,请参阅下面的link
尝试使用以下架构。
<schema name="simple" version="1.5">
<types>
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" preserveOriginal="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
</types>
<fields>
<field name='id' type='int' required='true' indexed="true" stored="true"/>
<field name='name' type='text' required='true' indexed="true" stored="true"/>
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>name</defaultSearchField>
<solrQueryParser defaultOperator='OR' />
</schema>