0

Lucene データ構造に保存するキャッシュされた名前リストがあります。名前が特定の文字で始まる人を取得したい。

例: 私のリストは以下です。name私はそれらを畑に保管します。

foo bar
blabla foo
foo2 bar
test data

検索すると、 、name:f*が返されます。フィールド内のすべての単語をチェックし、それも取得します。しかし、名前が で始まるようにする必要があります。その最初の文字はです。文末にある場合でも、レコードに で始まる単語が含まれているわけではありません。foo barfoo2 barblabla fooblabla foofff

何か案が ?

4

3 に答える 3

1

トークン化せずにフィールドを使用することをお勧めします。
また、ワイルドカード検索を使用する代わりに、トークンを生成するEdgeNGramTokenFilterを使用し、インデックス時に発生するワイルドカード検索よりもはるかに高速になります。

于 2013-07-04T04:30:48.427 に答える
1

ワイルドカード検索

Lucene は、(フレーズ クエリ内ではなく) 1 つの用語内での 1 文字および複数文字のワイルドカード検索をサポートしています。

1 文字のワイルドカード検索を実行するには、「?」を使用します。シンボル。

複数文字のワイルドカード検索を実行するには、「*」記号を使用します。

1 文字のワイルドカード検索では、1 文字を置き換えて一致する用語が検索されます。たとえば、「テキスト」または「テスト」を検索するには、次の検索を使用できます。

te?t 複数文字のワイルドカード検索では、0 個以上の文字が検索されます。たとえば、test、tests、または tester を検索するには、次の検索を使用できます。

テスト*

例、正規表現を使用

RegexQuery query = new RegexQuery(newTerm("^a.*$"));


query.setRegexImplementation(new JavaUtilRegexCapabilities());

return searcher.search(query, null, 1000).totalHits;

http://lucene.apache.org/core/4_3_1/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description

コード例:

        BasicConfigurator.configure();

        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

        // Store the index in memory:
        Directory directory = new RAMDirectory();
        // To store an index on disk, use this instead:
        // Directory directory = FSDirectory.open(new
        // File("./lucene/data"));
        IndexWriterConfig config = new IndexWriterConfig(
                Version.LUCENE_CURRENT, analyzer);
        IndexWriter iwriter;

        iwriter = new IndexWriter(directory, config);

        String[] words = { "Olimpia", "Cerro", "Olimpo", "Libertad",
                "Nacional", "Sol", "O'higgins", "Sao Paulo",
                "Oriente Petrolero", "Barrio Obrero", "B. Obrero" };

        for (String word : words) {
            Document doc = new Document();
            String text = word;
            doc.add(new Field("name", text, Field.Store.YES,
                    Field.Index.NOT_ANALYZED));

            // ,Field.Store.NO, Field.Index.NOT_ANALYZED
            iwriter.addDocument(doc);
        }

        iwriter.close();

        // Now search the index:

        logger.info("HelloLucene.main: query2 -----------");

        DirectoryReader ireader2 = DirectoryReader.open(directory);
        IndexSearcher isearcher2 = new IndexSearcher(ireader2);

        logger.info("HelloLucene.main: query2 -----------");
        RegexQuery query2 = new RegexQuery(new Term("name", "O.*"));
        query2.setRegexImplementation(new JavaUtilRegexCapabilities(
                JavaUtilRegexCapabilities.FLAG_CASE_INSENSITIVE));

        ScoreDoc[] hits2 = isearcher2.search(query2, null, 1000).scoreDocs;
        for (int i = 0; i < hits2.length; i++) {
            Document hitDoc = isearcher2.doc(hits2[i].doc);
            logger.info("HelloLucene.main: starting with O = "
                    + hitDoc.get("name"));

        }
于 2013-07-03T15:01:04.337 に答える
0

デフォルトでは、Lucene はこのように動作します。フィールドを用語にトークン化し、フィールド内の任意の場所に出現する用語を検索する場合。大規模なテキスト ドキュメントの場合、これは非常に理にかなっています。大量のテキストの最初から検索する必要はほとんどないからです。

トークン化された一連の用語ではなく、リテラル文字列として検索できるようにしたい場合、最善の解決策は、それを適切にサポートする方法でインデックスを作成することです。Solr.StrFieldは、 TextFieldではなく、そのための典型的なタイプの選択です

于 2013-07-03T16:14:13.887 に答える