【问题标题】:More like this doesn't give expected results更像这样并没有给出预期的结果
【发布时间】:2014-10-16 08:02:26
【问题描述】:

我正在实施一个更像这个处理程序的 solr 来寻找相似的客户。

我有 2 位客户,他们的姓名不同,住在同一个地址。我想给 solr 一个 entity_id 并让所有具有相似名称/地址的客户端返回。客户只需单击一个按钮即可将这两个客户联系在一起。

我正在使用 SolariumBundle 在代码中执行此操作,但首先让它与原始查询一起使用就足够了,如果可行,我可以自己将其调整到日光浴室。

这是我的 solrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>
  <luceneMatchVersion>LUCENE_36</luceneMatchVersion>
  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>

<updateHandler class="solr.DirectUpdateHandler2" />

<requestDispatcher handleSelect="true" >
    <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
</requestDispatcher>

<!-- request handlers -->
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
<lst name="defaults">
  <int name="mlt.mintf">2</int>
  <int name="mlt.mindf">1</int>
  <int name="mlt.minwl">5</int>
  <int name="mlt.maxwl">1000</int>
  <int name="mlt.maxqt">50</int>
  <int name="mlt.maxntp">50000</int>
  <bool name="mlt.boost">true</bool>
  <str name="mlt.fl">customer_data,entity_data,street</str>
  <bool name="mlt.match.include">false</bool>
</lst>
</requestHandler>

<requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />

<!-- config for the admin interface --> 
<admin>
    <defaultQuery>solr</defaultQuery>
</admin>
</config>

我的 schema.xml 的相关部分是:

<fields>
    <!-- general -->
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true" />
    <field name="type" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="entity_id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="sort_id" type="int" indexed="true" stored="true" multiValued="false"/>

    <field name="external_id" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="status" type="text" indexed="true" stored="true" multiValued="false"/>
    <field name="language" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="created" type="int" indexed="true" stored="true" multiValued="false"/>

    <field name="name" type="text" indexed="true" stored="true" multiValued="false"/>
    <field name="email" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="city" type="string" indexed="true" stored="false" multiValued="false"/>
    <field name="country" type="string" indexed="true" stored="false" multiValued="false"/>
    <field name="street" type="string" indexed="true" stored="false" multiValued="false"/>
    <field name="zipcode" type="string" indexed="true" stored="false" multiValued="false"/>

    <field name="entity_data" type="text_ngrm" indexed="true" stored="true" multiValued="true"/>
    <field name="customer_data" type="text_ngrm" indexed="true" stored="true" multiValued="true" termVectors="true" />

    <!-- Entity data filling -->
    <copyField source="entity_id" dest="entity_data"/>
    <copyField source="briljant_id" dest="entity_data"/>
    <copyField source="name" dest="entity_data"/>
    <copyField source="email" dest="entity_data"/>
    <!-- End entity data -->

    <!-- Customer data -->
    <copyField source="name" dest="customer_data"/>
    <copyField source="email" dest="customer_data"/>
    <copyField source="city" dest="customer_data"/>
    <copyField source="country" dest="customer_data"/>
    <copyField source="street" dest="customer_data"/>
    <copyField source="zipcode" dest="customer_data"/>
    <!-- End customer data -->
</fields>

我目前执行此查询:http://localhost:8983/solr/core0/mlt?q=entity_id%3A50&amp;wt=json&amp;indent=true&amp;mlt.fl:customer_data,它确实会为具有相似名称的客户返回结果。 例如,如果 customer_id:50(我要查询的那个)的名称为“Foo Bar”,它会返回名称为“Foo Bar”、“Bar Foo”、“John Foo”的客户。街道/国家/邮政编码的相似性不起作用。

在 debug:parsedquery 中,我可以看到 customer_data:Foo customer_data:Bar customer_data oo Bar, ... 的不同突变,但地址部分没有。

如何确保查询是针对:customer_data:Foo customer_data:Bar customer_data:teststreet customer_data:Antwerp

【问题讨论】:

  • 我猜你打算用&amp;mlt.flt=customer_data 而不是: 来调用它?
  • @MatsLindh,是的,实际查询是:/mlt?q=entity_id%3A50&amp;wt=json&amp;indent=true&amp;mlt.fl=customer_data,但这并没有给出不同的结果。
  • 我猜这是因为名称条目已经为您提供了足够的匹配项。仅使用街道字段而不是 customer_data,您应该会在街道上看到匹配项。
  • @MatsLindh,如果我使用查询字符串:mlt?q=entity_id%3A50&amp;wt=json&amp;indent=true&amp;mlt.fl=street 我得到 0 结果。 "response":{"numFound":0,"start":0,"docs":[]
  • 好吧,该字段没有被存储。这可能会影响它。

标签: solr morelikethis solarium


【解决方案1】:

定义为 string 类型的字段不会被标记化,因此 MLT 会找到不太相似的文档。

将受影响的字段更改为 solr.TextField 类的类型,它应该可以工作。

例如:

<!-- type definition -->
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多