web-dev-qa-db-ja.com

Luceneはnullクエリではありませんか?

Nullではない特定のフィールドを検索するクエリを作成するにはどうすればよいですか?

field_name:* 動かない。私は試した field_name:[a* to z*]これは英語では問題なく機能しますが、すべての言語を網羅しているわけではありません。

別の提案はありますか?

17
Chandra

これは現在、Luceneではサポートされていません。議論については this を参照してください。

別のオプションとして、事前定義された文字列(nullnullnullnullなど)がnullの場合、フィールド値として格納することもできます。次に、ネガティブフィルターを使用してこれらのレコードを削除できます。 (私はこれがあまり好きではありませんが、より良いオプションを考えることはできません)

4
nikhil500

場合によってはこれが機能することがわかりましたfield:([0 TO 9] [a TO z])

15
Karolis

質問に遅れて到着する他の人のために、 documentation にはこの小さなスニペットが含まれています:

  • ここで、フィールドtitleにはnull以外の値があります。
    _exists_:title
6
Carolyn Conway

field:[* TO *]またはfield:["" TO *]を試してください。ただし、これにはフィルターを使用する方がおそらく良いでしょう。

3
mindas

同じ問題が発生していましたが、クエリパーサーに設定できるプロパティがあり、検索語の先頭にワイルドカード文字を含めることができます。

queryParser.setAllowLeadingWildcard(true);

これは私にとって問題を解決しました

検索語の先頭のワイルドカード-Lucene を参照してください。

3
Edd

現在のLuceneバージョンでは、FieldValueQueryは古くなっています。現在、以下を使用できます。

new DocValuesFieldExistsQuery(name)

これはSortedDocValuesFieldsに対してのみ機能するため、ドキュメントの作成時に追加する必要があります。

doc.add(new SortedDocValuesField(name, new BytesRef(value));
doc.add(new StringField(name, value, Field.Store.Yes)); //optional

2行目では、値を取得できます(DocValuesFieldsの値を文字列として読み取ることはできません)。
luceneでは、前述の例と同じ名前の複数のフィールドを使用できることに注意してください。

1
kade99

org.Apache.lucene.search.FieldValueQueryを見てください:

A Query that matches documents that have a value for a given field as reported by LeafReader#getDocsWithField(String).

docValuesでのみ機能するため、ドキュメントの作成方法を変更する必要があることに注意してください。

document.add(new StringField("field-name", "field-value", Field.Store.YES));
document.add(new SortedDocValuesField("field-name", new BytesRef("field-value")));

ここで2つのフィールドを追加しました。値を取得するには、通常のStringFieldが必要です。古いバージョンのLuceneには BinaryDocValues#get() を使用することもできますが、ご覧のとおり、v7では削除されています。わからない、今値を取得する適切な方法は何ですか-チェックしてください this

0