【问题标题】:solr ignores values in multifield searchsolr 忽略多字段搜索中的值
【发布时间】:2018-06-04 19:34:14
【问题描述】:

我刚刚开始使用 Solr,但我不确定我缺少什么。我有 2 个字段 streetAddresses 和 city。 streetAddresses 是文本字段,城市是字符串字段。这在我开始查看 Solr 之前就已经配置好了。字段的 schema.xml 看起来像

<types>
<fieldType class="org.apache.solr.schema.TextField" name="TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
<fieldType class="org.apache.solr.schema.StrField" name="StrField"/>
</types>
<fields>
 <field indexed="true" multiValued="true" name="streetAddresses" stored="true" type="TextField"/>
 <field docValues="true" indexed="true" multiValued="true" name="cities" stored="true" type="StrField"/>
</fields>

问题是当我查询多个字段时,streetAddresses 的解析字符串只有字符串的第一部分,其余部分被忽略。例如,如果我在 streetAddresses 中搜索 111 Main St 并在城市中搜索 Boston,则查询看起来像

q=streetAddresses%3A111+Main+st+OR+cities%3ABoston&wt=json&indent=true&debugQuery=true&defType=edismax&qf=streetAddresses%2Ccities

调试看起来像

"rawquerystring": "streetAddresses:111 Main st OR cities:Boston",
"querystring": "streetAddresses:111 Main st OR cities:Boston",
"parsedquery": "(+(streetAddresses:111 cities:Boston))/no_coord",
"parsedquery_toString": "+(streetAddresses:111 cities:Boston)",
"explain": {},
"QParser": "ExtendedDismaxQParser",
"altquerystring": null,
"boost_queries": null

我得到了基于 111 的 streetAddresses 的结果,但字符串的其余部分 (Main st) 被忽略。我试图搜索这个问题,有些人提到了停用词或 wordlimit,但我没有使用任何这些。有什么想法吗?

【问题讨论】:

    标签: solr tokenize solrj


    【解决方案1】:
    streetAddresses:111 Main st OR cities:Boston
    

    表示“在 streetAddresses 中搜索 111,在默认搜索字段中搜索 Main(.. 可能不再默认设置),在默认搜索字段中搜索 st,并在默认搜索字段中搜索 Boston cities.

    如果您想在streetAddresses 中搜索111 Main st,则必须引用该值(并使用短语搜索):

    streetAddresses:"111 Main st"
    

    ..或每次指定字段:

    streetAddresses:111 streetAddresses:Main streetAddresses:st
    

    【讨论】:

    • 那为什么如果我只是通过 streetAddresses 搜索,情况就不一样了。查询:q=streetAddresses%3A111+Main+St&wt=json&indent=true&debugQuery=true&defType=edismax&qf=streetAddresses 和“parsedquery_toString”:“+(streetAddresses:111 (streetAddresses:main) (streetAddresses:st))”。 usingquotes 的另一个问题是我将无法使用通配符,对吗?
    • 如果您比较这两个查询,第二个查询也需要匹配main - 它的解析方式不同。如果您需要 *,您可以使用复杂的短语查询,但在这种情况下您可能根本不想要标记化类型?
    • 所以你是说我不需要 StandardTokenizerFactory?如果我理解正确的话,我也这么认为。场景是,如果我搜索 111 Main St,我想查看包含 111 Main St 的文档,并且我还可能使用通配符,例如 111 Main*。理想情况下,我需要了解 Solr 评分的工作原理,因为我们可能需要搜索 111(或)Main(OR)St 但现在你认为最好的方法是像 {!complexphrase inOrder=true}address:"111 Main*" 吗?
    • 对于这种情况,请使用带小写过滤器的 KeywordTokenizer。它会将整个文本保留为单个标记,并将其小写。通配符搜索应该做你想做的事,一定要用`\`转义空格。
    • 是的,我认为这就是答案,但问题是还有一个名称字段,它也是与地址相同的文本。唯一的区别是用户还想按姓氏、名字进行搜索。据我了解,关键字标记器不适用于标点逗号和倒序。所以留下了选择。如果我想使用关键字标记器,是否可以使用模式 API curl 命令更新字段的标记器,我是否需要重新加载数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多