官术网_书友最值得收藏!

3.3.6 短語查詢

如果按字索引中文文檔,則查詢的時候往往要求文檔中的這些字是連續(xù)出現(xiàn)的。使用PhraseQuery可以查詢連續(xù)出現(xiàn)的幾個關(guān)鍵詞。PhraseQuery稱為短語匹配查詢,用于要求精確匹配的查詢。PhraseQuery使用了詞保存在索引中的位置信息,因此需要索引中的相關(guān)列已經(jīng)保存了位置信息。例如按字索引,按字查詢“開封”:

        PhraseQuery query = new PhraseQuery();
        query.add(new Term("subject", "開"));
        query.add(new Term("subject", "封"));

搜索“軟件工程師”時,標(biāo)題為“安卓軟件開發(fā)工程師”排第一位,而標(biāo)題為“軟件工程師”反而排在后面。詞庫為:“軟件”“工程師”。為了解決這個問題,可以增加短語查詢:

        PhraseQuery query = new PhraseQuery();
        query.add(new Term("subject", "軟件"));
        query.add(new Term("subject", "工程師"));

有時候要匹配上的詞之間有間隔,匹配上的詞之間的距離稱為slop。默認(rèn)情況下,slop的值是0,可以通過調(diào)用setSlop()方法設(shè)置這個值。例如,用戶搜索“西紅柿牛腩”時,會匹配上“西紅柿燉牛腩”。

        PhraseQuery query = new PhraseQuery();
        query.setSlop(1);
        query.add(new Term("subject", "西紅柿"));
        query.add(new Term("subject", "牛腩"));

使用PhraseQuery完整的例子:

        public static void main(String[] args) throws Exception {
            //在內(nèi)存中建立索引
            Directory directory = new RAMDirectory();
            Analyzer analyzer = new StandardAnalyzer();
            IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
            IndexWriter writer = new IndexWriter(directory, iwc);


            // 索引一些文檔
            writer.addDocument(createDocument("1", "foo bar baz"));
            writer.addDocument(createDocument("2", "red green blue"));
            writer.addDocument(createDocument("3", "test foo bar test"));
            writer.close();


            // 查找包含foo bar這個短語的文檔
            String sentence = "foo bar";
            IndexReader reader = IndexReader.open(directory);
            // 根據(jù)IndexReader創(chuàng)建IndexSearcher
            IndexSearcher searcher = new IndexSearcher(reader);
            PhraseQuery query = new PhraseQuery();
            String[] words = sentence.split(" ");
            for (String word : words) {
                query.add(new Term("contents", word));
            }


            // 顯示搜索結(jié)果
            TopDocs topDocs = searcher.search(query, 10);
            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                System.out.println(doc);
            }
        }


        private static Document createDocument(String id, String content) {
            Document doc = new Document();
            doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED));
            doc.add(new Field("contents", content, Store.YES, Index.ANALYZED,
                    Field.TermVector.WITH_POSITIONS_OFFSETS));
            return doc;
        }
主站蜘蛛池模板: 梧州市| 肥乡县| 特克斯县| 固安县| 贺州市| 陇南市| 台湾省| 牡丹江市| 鹤峰县| 灌阳县| 象州县| 思茅市| 区。| 基隆市| 江口县| 贵定县| 睢宁县| 枣阳市| 平安县| 绥滨县| 恩施市| 望都县| 诸暨市| 民权县| 奇台县| 尚义县| 安康市| 工布江达县| 桓仁| 县级市| 仁寿县| 扬中市| 绵阳市| 维西| 绥宁县| 孝义市| 英超| 张家界市| 库伦旗| 德格县| 南乐县|