2016-04-04 14 views
1

:((AとB)またはc)AND D.のSolr complexphraseクエリSolrの(4.10)でcomplexphraseパーサを使用している間、私はこのクエリを実行しようとして無視し、節

順序が重要であり、( B)またはCはDの前に表示されます。

これは私のクエリです - {!complexphrase inOrder=true}title:"((a AND b) OR c) d"~1000です。

問題は、Solrが最初のANDをORとして脅かし、そのタイトルが(a OR b OR c) AND dであるすべてのドキュメントを返すことです。 どうすればいいですか?

+0

この種の構文(複雑なフレーズ内で「AND」と「OR」)がサポートされていることを示すドキュメントはありませんか?私は持っているとは思わない。 – femtoRgon

+1

@femtoRgonこれはドキュメントではありませんが、私はこの[ブログ記事](http://yonik.com/solr-4-8-features/)ともっと公式な記事を見ました(ここではhttps:// cwiki。 apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser)。最初の文は_ ComplexPhraseQParserはLuceneのComplexPhraseQueryParser_を使ってフレーズクエリ内でワイルドカード、ORなどをサポートしています。 – ashual

答えて

0

複合フレーズクエリパーサーでANDの構文がサポートされているとは思われません。 ORSpanOrを使用します。 Luceneには同等のものはありませんSpanAndです。

SpanAndが存在しても、期待したものとは異なる意味になるかもしれません。 ORは、同じ位置にあると一致するために使用されます。。つまり、(A OR B) Cは「A C」と「B C」に一致します。したがって、この理論的なSpanAnd (A AND B) Cは、AとBの両方をCの直前で同じ位置に置かなければなりません。索引で同じスペースを占める2つの語を持つことは可能ですが(ステマ、シノニムフィルタなどで)、直接検索するのは特に興味深いことではありません。

はあなたのようなもので行く必要があるかもしれない、あなたが探しているものを達成するために:あなたが書いているよう "a b d"~1000 "c d"~1000

このクエリを表現することである(おおよそ)可能LuceneのSpanQuery APIを介して:

SpanQuery abQuery = new SpanNearQuery(new SpanQuery[] { 
     new SpanTermQuery(new Term("field", "a")), 
     new SpanTermQuery(new Term("field", "b")) 
    }, 1000, true); 
SpanQuery cQuery = new SpanTermQuery(new Term("field", "c")); 
SpanQuery abcQuery = new SpanOrQuery(new SpanQuery[] { 
     abQuery, 
     cQuery 
    }); 
Query finalQuery = new SpanNearQuery(new SpanQuery[] { 
     abcQuery, 
     new SpanTermQuery(new Term("field", "d")) 
    }, 1000, true); 
TopDocs docs = searcher.search(finalQuery, 10); 

しかし、私はComplexPhraseパーサーがそれを表現する能力があるとは思いません。それはネストされたSpanNearsを含んでいます。パーサーがサポートしているとは思えません。

+0

Luceneでこのクエリーを書く方法は他にありますか? – ashual

+0

@ashual - そうではありません。サラウンドは、試してみる可能性の高い他のクエリパーサですが、このようなネストもサポートしていません。 – femtoRgon

関連する問題