【问题标题】:solr 4.7 query with "and"solr 4.7 用“and”查询
【发布时间】:2014-04-08 17:37:28
【问题描述】:

我正在尝试使用 solr (4.7.1) 选择查询,但我找不到任何有用的示例。我真的不明白 solr 查询背后的逻辑。 -text:, +text:, : !(-text:??)。

我想对字段“first_name”和“last_name”进行选择

http://127.0.0.1:8080/solr-4.7.1/persons/select?q=first_name:%22JOSHUA%22%20and%20+last_name:%22MCKAY%22&rows=10&sort=no_persons+asc

在 SQL 中:

select * from persons where first_name like '%JOSHUA%' and last_name like '%MCKAY%' order by no_persons asc

但结果与查询无关。它更像是一个名字:?或姓氏:?。

另外,我要使用 levenshtein 距离算法吗?我知道它类似于“~30”。

与使用简单查询相比,使用 solr 配置数据库同步时遇到的问题更少...

schema.xml:

<fields>
   [....]
   <field name="first_name" type="text_name" indexed="true" stored="true" multiValued="true"/>
   <field name="last_name" type="text_name" indexed="true" stored="true" multiValued="true"/>
   <field name="full_name" type="text_name" indexed="true" stored="true" multiValued="true"/>
   <copyField source="first_name" dest="full_name"/>
   <copyField source="last_name" dest="full_name"/>
   [....]
</fields>

<types>
   [....]
   <fieldType name="text_name" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
  </analyzer>
  <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>
  </analyzer>
</fieldType>
   [....]
</types>

【问题讨论】:

标签: solr lucene


【解决方案1】:

试试这个:

q=first_name%3A"JOSHUA"+AND+last_name%3A"MCKAY"

关于levenshtein距离算法,类似的功能是用SpellCheckComponent完成的,它内部默认使用Lucene SpellChecker,它实现了Levenshtein。

另外,如果您看到 SpellCheckComponent 的配置参数 &lt;str name="accuracy"&gt;0.7&lt;/str&gt; 可用于配置返回结果的准确性。

【讨论】:

  • 没有办法在select中指定距离?
  • 是的,使用 ~after 查询关键字。找到这个 lucene.apache.org/core/3_6_0/queryparsersyntax.html#Proximity Searches
  • 我试过q=first_name%3A"JOSHUA"~100+AND+last_name%3A"MCKAY"~100,但它不起作用。我还测试了&amp;qs=100ps=100 也没有工作
  • ~100 放在关键字之后意味着您要搜索相隔 100 个字以内的关键字。例如,"JOSHUA MCKAY"~100 将在指定字段中搜索 100 个单词距离内的单词 JOSHUA 和 MCKAY。但是,在您的情况下,两个词都需要在不同的字段中进行搜索。在这种情况下,我认为不能应用模糊搜索。它适用于一个领域。
猜你喜欢
  • 2013-04-08
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2014-04-25
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多