`

Lucene其他查询方式

阅读更多
1. 指定项范围查询TermRangeQuery

2. 指定数字范围查询NumericRangeQuery

3. 指定字符串开头搜索PrefixQuery

4. 组合查询BooleanQuery

New maven project ->
Create a simple project ->
    Group Id: com.andrew.lucene
    Artifact Id: Lucene04
    Version: 0.0.1-SNAPSHOT
    Packaging: jar


pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.andrew.lucene</groupId>
  <artifactId>Lucene04</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
      <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
  </dependencies>
</project>


Indexer.java代码

package com.andrew.lucene;

import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Indexer {
    private Integer ids[] = { 1, 2, 3 };
    private String citys[] = { "aingdao", "banjing", "changhai" };
    private String descs[] = { "Qingdao is b beautiful city.", "Nanjing is c city of culture.",
            "Shanghai is d bustling city." };
    private Directory dir;
    // 获取IndexWriter实例
    private IndexWriter getWriter() throws Exception {
        Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        IndexWriter writer = new IndexWriter(dir, iwc);
        return writer;
    }
    // 生成索引
    private void index(String indexDir) throws Exception {
        dir = FSDirectory.open(Paths.get(indexDir));
        IndexWriter writer = getWriter();
        for (int i = 0; i < ids.length; i++) {
            Document doc = new Document();
            doc.add(new IntField("id", ids[i], Field.Store.YES));
            doc.add(new StringField("city", citys[i], Field.Store.YES));
            doc.add(new TextField("desc", descs[i], Field.Store.YES));
            writer.addDocument(doc); // 添加文档
        }
        writer.close();
    }
    public static void main(String[] args) throws Exception {
        new Indexer().index("E:\\lucene5");
    }
}


SearchTest.java代码

package com.andrew.lucene;

import java.nio.file.Paths;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SearchTest {
    private Directory dir;
    private IndexReader reader;
    private IndexSearcher is;
    @Before
    public void setUp() throws Exception {
        dir = FSDirectory.open(Paths.get("E:\\lucene5"));
        reader = DirectoryReader.open(dir);
        is = new IndexSearcher(reader);
    }
    @After
    public void tearDown() throws Exception {
        reader.close();
    }
    // 指定项范围搜索
    @Test
    public void testTermRangeQuery() throws Exception {
        TermRangeQuery query = new TermRangeQuery("desc", new BytesRef("b".getBytes()), new BytesRef("c".getBytes()), true, true);
        TopDocs hits = is.search(query, 10);
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("id"));
            System.out.println(doc.get("city"));
            System.out.println(doc.get("desc"));
        }
    }
    // 指定数字范围
    @Test
    public void testNumericRangeQuery() throws Exception {
        NumericRangeQuery<Integer> query = NumericRangeQuery.newIntRange("id", 1, 2, true, true);
        TopDocs hits = is.search(query, 10);
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("id"));
            System.out.println(doc.get("city"));
            System.out.println(doc.get("desc"));
        }
    }
    // 指定字符串开头搜索
    @Test
    public void testPrefixQuery() throws Exception {
        PrefixQuery query = new PrefixQuery(new Term("city", "a"));
        TopDocs hits = is.search(query, 10);
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("id"));
            System.out.println(doc.get("city"));
            System.out.println(doc.get("desc"));
        }
    }
    // 多条件查询
    @Test
    public void testBooleanQuery() throws Exception {
        NumericRangeQuery<Integer> query1 = NumericRangeQuery.newIntRange("id", 1, 2, true, true);
        PrefixQuery query2 = new PrefixQuery(new Term("city", "a"));
        BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
        booleanQuery.add(query1, BooleanClause.Occur.MUST);
        booleanQuery.add(query2, BooleanClause.Occur.MUST);
        TopDocs hits = is.search(booleanQuery.build(), 10);
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("id"));
            System.out.println(doc.get("city"));
            System.out.println(doc.get("desc"));
        }
    }
}

运行结果:

1
aingdao
Qingdao is b beautiful city.
2
banjing
Nanjing is c city of culture.
3
changhai
Shanghai is d bustling city.

1
aingdao
Qingdao is b beautiful city.
2
banjing
Nanjing is c city of culture.

1
aingdao
Qingdao is b beautiful city.

1
aingdao
Qingdao is b beautiful city.
分享到:
评论

相关推荐

    Lucene3.0之查询类型详解

    在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...

    lucene引擎和sqlite数据库分词查询

    Lucene虽然不直接提供NLP功能,但可以通过与其他NLP库(如Stanford NLP或NLTK)集成,实现词性标注、命名实体识别、情感分析等功能,从而帮助确定哪些单词或句子是关键的。例如,高频词汇可能包含大量停用词,而真正...

    Lucene资料大全(包括Lucene_in_Action书等)

    Lucene支持布尔查询、短语查询、模糊查询等多种查询类型。 4. **结果排序**:Lucene通过评分机制(如TF-IDF)对搜索结果进行排序,得分最高的结果优先展示。 5. **过滤与聚合**:Filter和Collector组件可以用于...

    lucene-4.7.0全套jar包

    - **Miscellaneous模块**:包含其他额外的工具和功能,如`lucene-misc-4.7.0.jar`。 - **Codecs模块**:提供了不同的编码方式,用于存储和检索索引,如`lucene-codecs-4.7.0.jar`。 - **Contrib模块**:包含社区...

    Lucene group by ,分组实现

    这使得用户能够按类别聚合文档,例如,根据作者、日期或其他分类标准来查看搜索结果。 在 Lucene 中,分组功能并不是内建的,但可以通过自定义 collector 来实现。`GroupCollector` 就是这样一个关键组件,它是实现...

    Lucene3.3.0学习Demo

    在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo"是针对这一版本进行的实践教学资源,旨在帮助开发者更好地理解和使用Lucene。 首先,我们来...

    Lucene5学习之FunctionQuery功能查询

    这种查询方式在需要对搜索结果进行自定义排序或加权时非常有用。 **描述解析:** 博文链接给出的是一个在iteye博客平台上的文章,作者为"iamyida",该文章详细探讨了如何在Lucene5中使用FunctionQuery进行功能查询...

    lucene_jar包

    4. 高级特性:Lucene还提供了如布尔查询、短语查询、模糊查询、范围查询等多种查询方式,以及评分机制、过滤器、聚合等功能,可以满足复杂的搜索需求。 **4. 应用场景** Lucene广泛应用于网站搜索引擎、企业内部...

    lucene所有的jar包

    4. **codecs jar包**:定义了索引的编码和解码方式,如`lucene-codecs-4.9.0.jar`,不同版本的编码格式可能会影响索引的存储效率和检索性能。 5. **contrib jar包**:这些是社区贡献的扩展功能,例如`lucene-memory...

    lucene jar包

    3. **查询解析**:Lucene支持丰富的查询语法,包括布尔查询、短语查询、范围查询、模糊查询等,同时提供查询分析器,将用户输入的查询字符串转化为适合索引的查询表达式。 4. **搜索与评分**:Lucene的搜索算法基于...

    ssh+lucene搜索实例

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。

    lucene 的开发包6.6

    3. 高级特性:Lucene支持布尔查询、短语查询、模糊查询、范围查询等多种查询方式,还可以实现自定义排序和高亮显示搜索结果。 4. 更新与删除:通过IndexWriter可以更新已索引的文档,或者删除不再需要的文档。 四...

    Lucene组件

    6. **QueryParser**: 查询解析器将用户的自然语言查询转换为Lucene理解的查询语法,支持多种查询构造方式,如布尔运算符、短语查询等。 7. **ScoreDoc**: 当搜索器返回结果时,ScoreDoc对象包含了每个匹配文档的...

    lucene in action 电子版

    - **布尔搜索**:讨论了基于布尔逻辑的查询方式,如AND、OR、NOT操作符的应用。 - **近似匹配**:讲解了如何实现模糊匹配、同义词扩展等功能,以提高搜索的灵活性和准确性。 - **排序与评分**:分析了Lucene中...

    lucene-4.6.0全套jar包

    6. 集成性增强:Lucene 4.6.0可以轻松集成到其他Java应用中,如Solr和Elasticsearch,提供更高级别的搜索服务。 三、使用Lucene 4.6.0的步骤 1. 创建索引:定义文档模型,实例化Analyzer,创建IndexWriter,并将...

    Lucene索引器实例

    - 更新文档:Lucene不支持直接更新已存在的文档,而是通过删除旧文档并重新添加新文档的方式来实现。 - 删除文档:调用`IndexWriter`的`deleteDocuments`方法,传入匹配待删除文档的查询条件。 **5. 关闭索引器** ...

    apache Lucene4.7最全最新的jar包

    在实际应用中,开发者通常会将Apache Lucene与诸如Spring、Hibernate等其他Java框架集成,以构建完整的搜索引擎解决方案。导入"Lucene.jar"到项目工程中,就可以利用这些功能来提升应用的搜索体验。 总的来说,...

    lucene原理与代码分析完整版

    Lucene支持灵活的查询语法,允许用户通过自然语言风格的查询字符串来表达复杂的搜索需求。JavaCC是一个强大的编译工具,用于生成解析器,而QueryParser则是用于解析查询字符串的Lucene组件。 #### 七、Lucene的查询...

    lucene的一个实用例子

    用户可以使用布尔运算符、短语查询、范围查询等多种方式构建复杂的查询。 6. **排序与评分(Scoring)**:Lucene 会根据相关性对搜索结果进行评分,高分的文档排在前面。相关性通常基于词频、TF-IDF(词频-逆文档...

    lucene api

    Lucene支持多种查询类型,如布尔查询(BooleanQuery)、短语查询(PhraseQuery)、范围查询(RangeQuery)等,以及复杂的组合查询。 5. **搜索与评分**:使用Query对象在索引中搜索匹配的文档,Lucene会返回一个...

Global site tag (gtag.js) - Google Analytics