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と言うとき、これらは1つの単一ユニットまたはそれぞれ1つの単語です。それらにインデックスを付けると、それらはそのまま転置インデックスに格納されます。つまり、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 に答える