2

我正在使用 Apache Solr,假设我搜索“B”我希望 Solr 返回“AB”、“BA”、“ABA”

    SolrQuery query = new SolrQuery();
    query.setQuery("*:*");
    query.addFilterQuery("color:*B*");

但是,它抛出异常,我该怎么办?

Caused by: org.apache.lucene.queryParser.ParseException: Cannot parse 'color:*B*': '*' or '?' not allowed as first character in WildcardQuery
    at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:211)
    at org.apache.solr.search.LuceneQParser.parse(LuceneQParserPlugin.java:80)
    at org.apache.solr.search.QParser.getQuery(QParser.java:142)
    at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:114)
    ... 17 more
Caused by: org.apache.lucene.queryParser.ParseException: '*' or '?' not allowed as first character in WildcardQuery
4

1 回答 1

1

当您说 AB 或 ABA 或 BA 时,它们是一个单独的单位或一个单词。当您对它们进行索引时,它们按原样存储在倒排索引中,即 ABA 或 BA 等。当您在倒排索引中搜索 B 时,找不到它。您需要做的是将您的字段标记为 n-gram 索引(而不是 schema.xml 中的 type="text" 或 type="string" 将它们标记为 type="NGram"),这也会在顶部索引部分单词完整的话。一旦你完成了你的 N-Gram 索引,然后当你搜索 B 时,你会得到所有的 AB 或 BA 或 ABA。但请记住,N-Gram 索引是空间/时间密集型的。

例如,假设您的字段名称是 color,然后在您的 schema.xml 中:

<field name="color" type="nGram" indexed="true" stored="true" required="false" />

还要检查这部分 XML 是否存在于您的 schema.xml 中(如果没有,则复制粘贴):

<fieldType name="nGram" class="solr.TextField"
positionIncrementGap="100" stored="false" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<!-- potentially word delimiter, synonym filter, stop words,
NOT stemming -->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="1"
maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<!-- potentially word delimiter, synonym filter, stop words,
NOT stemming -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
于 2012-06-04T06:33:16.700 回答