9

我很难理解我的 SOLR 地址数据库存在的问题。

我从示例文件构建了这个。我基本上是在使用修改后的模式运行示例配置。

架构.xml

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="_version_" type="long" indexed="true" stored="true" required="false" multiValued="false" />

<field name="givenname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" />
<field name="middleinitial_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" />
<field name="surname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" />
<field name="gender_s" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="pictureuri_s" type="string" indexed="false" stored="true" required="false" multiValued="false" />
<field name="function_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" />
<field name="organizationalunit_s" type="text_general" indexed="true" stored="true" required="false" multiValued="false" />
<field name="organizationalunitdescription_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" />
<field name="company_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" />
<field name="street_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" />
<field name="streetnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" />
<field name="postcode_s" type="int" indexed="true" stored="true" required="false" multiValued="false" />
<field name="city_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" />
<field name="building_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" />
<field name="roomnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" />
<field name="country_s" type="text_en" indexed="true" stored="true" required="true" multiValued="false" />
<field name="countrycode_s" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="emailaddress_s" type="string" indexed="true" stored="true" required="false" multiValued="false" />
<field name="phone1_s" type="string" indexed="true" stored="true" required="false" multiValued="false" />
<field name="phone2_s" type="string" indexed="true" stored="true" required="false" multiValued="false" />
<field name="mobile_s" type="string" indexed="true" stored="true" required="false" multiValued="false" />
<field name="fax_s" type="string" indexed="true" stored="true" required="false" multiValued="false" />

我通过将大约 20.000 个随机测试数据集(如下所示)推送到post.jar来填充数据库:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<add>
    <doc>
        <field name="id">1352498443_1</field>
        <field name="givenname_s">Aynur</field>
        <field name="middleinitial_s"/>
        <field name="surname_s">Lehnen</field>
        <field name="gender_s">F</field>
        <field name="pictureuri_s">dummy_assets/female.jpg</field>
        <field name="function_s">Zugschaffner/in</field>
        <field name="organizationalunit_s">P 07</field>
        <field name="organizationalunitdescription_s">Lorem Ipsum sadipscing voluptua ipsum invidunt dolor et dolore invidunt sed consetetur accusam dolore Lorem tempor.</field>
        <field name="company_s">Lorem Lagna Epsum Emet</field>
        <field name="street_s">Erlenweg</field>
        <field name="streetnumber_s">82</field>
        <field name="postcode_s">76297</field>
        <field name="city_s">Lübeck</field>
        <field name="building_s"/>
        <field name="roomnumber_s">242</field>
        <field name="country_s">GERMANY</field>
        <field name="countrycode_s">DE</field>
        <field name="emailaddress_s">aynur.lehnen@lorem-lagna-epsum-emet.de</field>
        <field name="phone1_s">0392984823</field>
        <field name="phone2_s">0124111417</field>
        <field name="mobile_s">0325117132</field>
        <field name="fax_s">0171459177</field>
    </doc>
</add>

但是,在检索数据时,我似乎遇到了按字母排序的问题。考虑以下查询:

{
    "responseHeader": {
        "status": 0,
            "QTime": 5,
            "params": {
            "sort": "surname_s asc",
                "fl": "surname_s",
                "indent": "true",
                "wt": "json",
                "q": "city_s:berlin"
        }
    },
        "response": {
        "numFound": 1094,
        "start": 0,
        "docs": [{
            "surname_s": "Weil"
        }, {
            "surname_s": "Abel"
        }, {
            "surname_s": "Adam"
        }, {
            "surname_s": "Ade"
        }, {
            "surname_s": "Adrian"
        }, {
            "surname_s": "Aigner"
        }, {
            "surname_s": "Aigner"
        }, {
            "surname_s": "Alber"
        }, {
            "surname_s": "Alber"
        }, {
            "surname_s": "Albers"
        }]
    }
}

为什么“Weil”在第一个位置,而其余数据似乎排序正确?

4

3 回答 3

14

我相信在text_de字段类型中应用的一些附加分析器是导致这种排序行为的原因。以我的经验,为了在对字符串进行排序时获得最佳结果,请使用alphaOlySort下面显示的示例 schema.xml 附带的 fieldType。

<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
  <analyzer>
    <!-- KeywordTokenizer does no actual tokenizing, so the entire
         input string is preserved as a single token
      -->
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <!-- The LowerCase TokenFilter does what you expect, which can be
         when you want your sorting to be case insensitive
      -->
    <filter class="solr.LowerCaseFilterFactory" />
    <!-- The TrimFilter removes any leading or trailing whitespace -->
    <filter class="solr.TrimFilterFactory" />
    <!-- The PatternReplaceFilter gives you the flexibility to use
         Java Regular expression to replace any sequence of characters
         matching a pattern with an arbitrary replacement string, 
         which may include back references to portions of the original
         string matched by the pattern.

         See the Java Regular Expression documentation for more
         information on pattern and replacement string syntax.

         http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html
      -->
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([^a-z])" replacement="" replace="all"
    />
  </analyzer>
</fieldType>

我建议创建一个新字段,然后surname_s通过 copyField 复制值,如下所示:

 <field name="surname_s_sort" type="alphaOnlySort" indexed="true" stored="false" required="false" multiValued="false" />

 <copyField source="surname_s" dest="surname_s_sort"/>

注意:surname_s_sort不需要将值存储在字段中,因此也不需要存储stored="false"属性,除非您希望将其显示给用户。

然后你可以改变你的查询来排序surname_s_sort

于 2012-11-13T13:03:10.500 回答
4

排序在多值和标记化字段上效果不佳。

文档-
可以对文档的“分数”或任何 multiValued="false" indexed="true" 字段进行排序,前提是该字段未标记化(即:没有分析器)或使用仅生成单个 Term(即:使用 KeywordTokenizer)

使用字符串作为字段类型并将标题字段复制到新字段中。

<field name="surname_s_sort" type="string" indexed="true" stored="false"/>

<copyField source="surname_s" dest="surname_s_sort" />  

正如@Paige 回答的那样,您可以使用不标记字段的关键字标记器、小写过滤器。

于 2012-11-14T04:02:30.943 回答
0

我有类似的问题,我尝试了 alphaOnlySort。这在某些方面有效,但是当字段包含 -、/ 空格等值时,它开始弄乱排序结果。

所以结果是这样的

  1. / abc
  2. / abc2

所以我最终使用了小写的字段类型。它已经在那里,所以我认为它是默认类型。我确实使用了复制字段构造,所以我的最终配置是:

<schema>
    <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
    </fieldType>
    <fields>
       <field name="job_name_sort" type="lowercase" indexed="true" stored="false" required="false"/>
    </fields>
    <copyField source="job_name" dest="job_name_sort"/>
</schema>
于 2015-05-01T08:31:35.963 回答