成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

lucene的查詢(xún)與排序

baoxl / 3342人閱讀

摘要:序本文主要記錄一下的另外兩個(gè)要點(diǎn)的使用查詢(xún)與排序。在指定距離可以找到第一個(gè)單詞的查詢(xún)。查詢(xún)的幾個(gè)語(yǔ)句之間保持者一定的距離。同時(shí)查詢(xún)幾個(gè)詞句查詢(xún)。從一個(gè)詞距查詢(xún)結(jié)果中,去除一個(gè)詞距查詢(xún)。

本文主要記錄一下lucene的另外兩個(gè)要點(diǎn)的api使用:查詢(xún)與排序。

查詢(xún) 完全匹配查詢(xún)
   /**
     * 查找指定field中包含某個(gè)關(guān)鍵字
     * @throws IOException
     */
    @Test
    public void termQuery() throws IOException {
        String field = "title";
//        String queryStr = "in";
//        String queryStr = "Lucene in Action";
//        String queryStr = "action";
        String queryStr = "lucene";
        Term term = new Term(field,queryStr);
        Query query = new TermQuery(term);
        executeQuery(query);
    }
模糊查詢(xún)
 /**
     * 查找指定字段中包含與關(guān)鍵字相似的文檔
     * 查詢(xún)用于匹配與指定項(xiàng)相似的項(xiàng)
     * 編輯距離算法,兩個(gè)字符串之間相似度的一個(gè)度量方法
     * 用來(lái)決定索引文件中的項(xiàng)與指定目標(biāo)項(xiàng)的相似程度.
     * 取所有相同前綴(前綴長(zhǎng)度可以設(shè)定)的詞項(xiàng)做編輯距離
     *
     * 編輯距離實(shí)際上是表明兩個(gè)不同的字符串需要經(jīng)過(guò)多少次編輯和變換才能變?yōu)閷?duì)方。
     * 通常的編輯行為包括了增加一個(gè)檢索項(xiàng),刪除一個(gè)檢索項(xiàng),修改一個(gè)檢索項(xiàng),
     * 與普通的字符串匹配函數(shù)不同,模糊搜索里的編輯距離是以索引項(xiàng)為單位的。
     *
     * http://www.xinxilong.com/html/?2481.html
     * @throws IOException
     */
    @Test
    public void fuzzyQuery() throws IOException {
        String field = "title";
        String queryStr = "act";// 自動(dòng)在結(jié)尾添加 ~ ,即查詢(xún)act~
        Term term = new Term(field,queryStr);
        int maxEdits = 1;  //編輯距離最多不能超過(guò)多少
        int prefixLength = 3; //相同的前綴長(zhǎng)度
//        Query query = new FuzzyQuery(term,maxEdits,prefixLength);
        Query query = new FuzzyQuery(term,maxEdits);
//        Query query = new FuzzyQuery(term);
        executeQuery(query);
    }
多域查詢(xún) 同一個(gè)關(guān)鍵詞多個(gè)字段搜索
/**
     * http://my.oschina.net/MrMichael/blog/220694
     * 同一個(gè)關(guān)鍵詞多個(gè)字段搜索
     * 用MultiFieldQueryParser類(lèi)實(shí)現(xiàn)對(duì)同一關(guān)鍵詞的跨域搜索
     */
    @Test
    public void multiFieldQueryCrossFields() throws ParseException, IOException {
        String[] fields = new String[]{"title","desc"};
        String queryStr = "good";
        Map boosts = new HashMap();
        //設(shè)定它們?cè)谒阉鹘Y(jié)果排序過(guò)程中的權(quán)重,權(quán)重越高,排名越靠前
        boosts.put("title", 1.0f);
        boosts.put("desc", 0.7f);
        MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer(),boosts);
        Query query = parser.parse(queryStr);
        executeQuery(query);
    }
使用多個(gè)關(guān)鍵字及多個(gè)field進(jìn)行查詢(xún)
/**
     * 使用多個(gè)關(guān)鍵字,及多個(gè)field進(jìn)行查詢(xún)
     */
    @Test
    public void multiFieldQueryMultiKeyword() throws ParseException, IOException {
        String[] queries = {"good","lucene"};
        String[] fields = {"title","desc"};
        BooleanClause.Occur[] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
        Query query = MultiFieldQueryParser.parse(queries,fields,clauses,new StandardAnalyzer());
        executeQuery(query);
    }
通配符查詢(xún)
/**
     * 通配符查詢(xún)
     * 星號(hào)*:代表0個(gè)或多個(gè)字母
     * 問(wèn)號(hào)?:代表0個(gè)或1個(gè)字母
     */
    @Test
    public void wildcardQuery() throws IOException {
        String field = "title";
//        String queryStr = "*pute?";
        String queryStr = "act*";
        Term term = new Term(field,queryStr);
        Query query = new WildcardQuery(term);
        executeQuery(query);
    }
前綴查詢(xún)
   /**
     * 前綴查詢(xún)
     * 自動(dòng)在關(guān)鍵詞末尾添加*
     */
    @Test
    public void prefixQuery() throws IOException {
        String field = "title";
        String queryStr = "act"; //act*
        Term term = new Term(field,queryStr);
        Query query = new PrefixQuery(term);
        executeQuery(query);
    }
短語(yǔ)查詢(xún)
/**
     * http://blog.csdn.net/rick_123/article/details/6708527
     * 短語(yǔ)查詢(xún),對(duì)關(guān)鍵詞加引號(hào),通過(guò)位置移動(dòng)來(lái)匹配
     * slop的概念:slop是指兩個(gè)項(xiàng)的位置之間允許的最大間隔距離
     * 例如:slop設(shè)置為1,則 quick brown fox 可以匹配 quick fox
     */
    @Test
    public void phraseQuery() throws IOException {
        Query query = new PhraseQuery.Builder()
                .setSlop(3)
                .add(new Term("title", "computer"))
                .add(new Term("title","art"))
                .build();
        executeQuery(query);
    }
跨度查詢(xún)
/**
     * http://callan.iteye.com/blog/154251
     * 跨度查詢(xún),用于查詢(xún)多個(gè)詞的時(shí)候考慮幾個(gè)詞在文檔中的匹配位置
     * 與phraseQuery和multiFieldQuery很相似,都是通過(guò)位置限制匹配
     * 但是spanQuery更加靈活
     *
     * SpanQuery包括以下幾種:
     * SpanTermQuery:詞距查詢(xún)的基礎(chǔ),結(jié)果和TermQuery相似,只不過(guò)是增加了查詢(xún)結(jié)果中單詞的距離信息。
     * SpanFirstQuery:在指定距離可以找到第一個(gè)單詞的查詢(xún)。
     * SpanNearQuery:查詢(xún)的幾個(gè)語(yǔ)句之間保持者一定的距離。
     * SpanOrQuery:同時(shí)查詢(xún)幾個(gè)詞句查詢(xún)。
     * SpanNotQuery:從一個(gè)詞距查詢(xún)結(jié)果中,去除一個(gè)詞距查詢(xún)。
     */
    @Test
    public void spanQuery() throws IOException {
        SpanTermQuery query = new SpanTermQuery(new Term("title","art"));
        executeQuery(query);
    }

    /**
     * 第一次出現(xiàn)在指定位置
     * @throws IOException
     */
    @Test
    public void spanFirstQuery() throws IOException {
        SpanTermQuery query = new SpanTermQuery(new Term("title","art"));
        SpanFirstQuery spanFirstQuery =new SpanFirstQuery(query,2); //出現(xiàn)在第2個(gè)位置
        executeQuery(spanFirstQuery);
    }

    /**
     * SpanNearQuery中將SpanTermQuery對(duì)象作為SpanQuery對(duì)象使用的效果,與使用PharseQuery的效果非常相似。
     * 最大的區(qū)別是:在SpanNearQuery的構(gòu)造函數(shù)中的第三個(gè)參數(shù)為inOrder標(biāo)志,設(shè)置這個(gè)標(biāo)志為true,項(xiàng)添加的順序和其文檔中出現(xiàn)的順序相同
     */
    @Test
    public void spanNearQuery() throws IOException {
        SpanTermQuery queryScience = new SpanTermQuery(new Term("title","science"));
        SpanTermQuery queryArt = new SpanTermQuery(new Term("title","art"));
        SpanQuery[] queries = new SpanQuery[]{queryScience,queryArt};
        int slop = 2;//science 與 art兩個(gè)詞間隔在2以?xún)?nèi)
        boolean inOrder = false;//不需要按數(shù)組中的順序出現(xiàn)在文檔中
        SpanNearQuery query = new SpanNearQuery(queries,slop,inOrder);
        executeQuery(query);
    }

    @Test
    public void spanOrQuery() throws IOException {
        SpanTermQuery queryScience = new SpanTermQuery(new Term("title","science"));
        SpanTermQuery queryArt = new SpanTermQuery(new Term("title","art"));
        SpanQuery[] queries = new SpanQuery[]{queryScience,queryArt};
        int slop = 2;//science 與 art兩個(gè)詞間隔在2以?xún)?nèi)
        boolean inOrder = false;//不需要按數(shù)組中的順序出現(xiàn)在文檔中
        SpanNearQuery spanNearQuery = new SpanNearQuery(queries,slop,inOrder);

        SpanTermQuery queryComputer = new SpanTermQuery(new Term("title","lucene"));

        SpanOrQuery query = new SpanOrQuery(new SpanQuery[]{spanNearQuery,queryComputer});
        executeQuery(query);
    }
組合查詢(xún)
/**
     * 組合查詢(xún)
     * MUST與MUST組合表示并集
     * MUST與MUST_NOT表示包含與不包含
     * MUST_NOT與MUST_NOT組合沒(méi)有意義
     * SHOULD與SHOULD組合表示或
     * SHOULD與MUST表示MUST,其中SHOULD沒(méi)有任何價(jià)值
     * SHOULD與MUST_NOT相當(dāng)于MUST與MUST_NOT表示包含與不包含
     */
    @Test
    public void booleanQuery() throws IOException {
        TermQuery queryComputerInTitle = new TermQuery(new Term("title","computer"));
        TermQuery queryGoodInDesc = new TermQuery(new Term("desc","good"));

        BooleanQuery booleanQuery = new BooleanQuery.Builder()
                .add(queryComputerInTitle,BooleanClause.Occur.SHOULD)
                .add(queryGoodInDesc,BooleanClause.Occur.SHOULD)
                .setMinimumNumberShouldMatch(1)
                .build();
        executeQuery(booleanQuery);
    }
排序 根據(jù)域值排序
/**
     * 按指定字段排序
     * @throws IOException
     * @throws ParseException
     */
    @Test
    public void sortByField() throws IOException, ParseException {
        //Sort using term values as encoded Integers.  Sort values are Integer and lower values are at the front.
        boolean isReverse = false;
        SortField sortField = new SortField("title", SortField.Type.STRING,isReverse);
        Query query = new TermQuery(new Term("title","lucene"));
        Sort sort = new Sort(sortField);
        executeQuery(query, sort);
    }
根據(jù)索引順序查詢(xún)
   /**
     * 按索引順序排序
     * @throws IOException
     */
    @Test
    public void sortByIndexOrder() throws IOException {
        Query query = new TermQuery(new Term("title","lucene"));
        executeQuery(query,Sort.INDEXORDER);
    }
根據(jù)相關(guān)性排序
/**
     * 按文檔的得分排序
     * @throws IOException
     */
    @Test
    public void sortByRelevance() throws IOException {
        TermQuery queryComputerInTitle = new TermQuery(new Term("title","computer"));
        TermQuery queryGoodInDesc = new TermQuery(new Term("desc","good"));

        BooleanQuery query = new BooleanQuery.Builder()
                .add(queryComputerInTitle,BooleanClause.Occur.SHOULD)
                .add(queryGoodInDesc,BooleanClause.Occur.SHOULD)
                .setMinimumNumberShouldMatch(1)
                .build();
        executeQuery(query,Sort.RELEVANCE);
    }

本工程github

參考

細(xì)說(shuō) lucene的fuzzyquery和wildcardquery

lucene4下用MultiFieldQueryParser同時(shí)搜索多個(gè)field時(shí)

對(duì)Lucene PhraseQuery的slop的理解

lucene的多種搜索2-SpanQuery

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65463.html

相關(guān)文章

  • Lucene 查詢(xún)原理

    摘要:介紹如何優(yōu)化數(shù)值類(lèi)范圍查詢(xún)。查詢(xún)過(guò)程在中查詢(xún)是基于。在中為了查詢(xún)的這樣一個(gè)條件,會(huì)建立基于的倒排鏈。在單查詢(xún)上可能相比并沒(méi)有明顯優(yōu)勢(shì),甚至?xí)恍K詾榱酥С指咝У臄?shù)值類(lèi)或者多維度查詢(xún),引入類(lèi)。 前言 Lucene 是一個(gè)基于 Java 的全文信息檢索工具包,目前主流的搜索系統(tǒng)Elasticsearch和solr都是基于lucene的索引和搜索能力進(jìn)行。想要理解搜索系統(tǒng)的實(shí)現(xiàn)原理,就...

    FullStackDeveloper 評(píng)論0 收藏0
  • Lucene 查詢(xún)原理

    摘要:介紹如何優(yōu)化數(shù)值類(lèi)范圍查詢(xún)。查詢(xún)過(guò)程在中查詢(xún)是基于。在中為了查詢(xún)的這樣一個(gè)條件,會(huì)建立基于的倒排鏈。在單查詢(xún)上可能相比并沒(méi)有明顯優(yōu)勢(shì),甚至?xí)恍?。所以為了支持高效的?shù)值類(lèi)或者多維度查詢(xún),引入類(lèi)。 前言 Lucene 是一個(gè)基于 Java 的全文信息檢索工具包,目前主流的搜索系統(tǒng)Elasticsearch和solr都是基于lucene的索引和搜索能力進(jìn)行。想要理解搜索系統(tǒng)的實(shí)現(xiàn)原理,就...

    testHs 評(píng)論0 收藏0
  • Lucene就是這么容易

    摘要:就其本身而言,是當(dāng)前以及最近幾年最受歡迎的免費(fèi)信息檢索程序庫(kù)。這樣完全和數(shù)據(jù)庫(kù)進(jìn)行了隔離。當(dāng)一個(gè)文檔出現(xiàn)在了搜索結(jié)果中,這就意味著該文檔與用戶(hù)給定的查詢(xún)語(yǔ)句是相匹配的。 showImg(https://segmentfault.com/img/bVbuifx?w=258&h=258);公眾號(hào)閱讀https://mp.weixin.qq.com/s/M3... Lucene [TOC] ...

    894974231 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<