当前位置: 首页 > 知识库问答 >
问题:

使lucene字符串字段范围可搜索

颛孙铭
2023-03-14

版本字符串有一个支持java类(版本),它实现了Comparable。

我的分析器是一个分析器包装器,它是一个小写和空格分析器,类似于内置的分析器。我使用经典的查询解析器进行搜索。在确切的条件下搜索工作良好。

我想做的是:

我试图在索引之前将版本字符串转换为int,但查询输入需要以某种方式转换,以便在搜索之前将版本字符串转换为int。

看起来我必须为version字段实现一个自定义分析器,但是我在寻找类似的示例时遇到了问题。

如果有人能给我指明正确的方向,那就太好了!

共有1个答案

令狐献
2023-03-14

您没有提到Lucene版本,所以我假设是最新版本(>=6.0.0)。

TermRangeQuery似乎适合您的需要,但我过去没有使用过这个类。

我写了下面的示例程序来测试,它似乎给了我想要的结果。使用下面的代码时,请包含所需的lucene JAR。

package lucene.productversion;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;


public class App 
{
    private static String versionField = "version";

    public static void main( String[] args ) throws IOException
    {
        App app = new App();

        System.out.println( "Staring Product Version!" );

        File indexDir = new File("D:\\experiments");
        FSDirectory directory = FSDirectory.open(indexDir.toPath());

        Analyzer analyzer = new SimpleAnalyzer();

        app.index(analyzer, directory);

        app.search(analyzer, directory);

        System.out.println( "End Product Version!" );

    }

    private void search(Analyzer analyzer,FSDirectory directory) throws IOException{

        IndexReader reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);

        Query query =  TermRangeQuery.newStringRange(versionField, "1.0", "2.1-RC2", true, true);

        TopDocs topDocs  = searcher.search(query, 10);


        if(topDocs.totalHits <= 0 ){
            System.out.println("No Hits Found");
            return;
        }

        for(ScoreDoc doc:topDocs.scoreDocs){
            System.out.println("Doc Id :"+doc.doc+" Version Number :"+searcher.doc(doc.doc).get(versionField));
        }

        reader.close();

        System.out.println("Searching Completed");
    }

    private void index(Analyzer analyzer,FSDirectory directory) throws IOException{

        IndexWriterConfig config = new IndexWriterConfig(analyzer);

        config.setOpenMode(OpenMode.CREATE);

        IndexWriter writer = new IndexWriter(directory, config);


        for(String version:versions()){
            Document doc = new Document();

            doc.add(new StringField(versionField,version,Store.YES));

            writer.addDocument(doc);

        }

        writer.commit();
        writer.close();

        System.out.println("Indexing Completed");
    }

    private List<String> versions(){

        List<String> versions = new ArrayList<>();

        versions.add("1.0");
        versions.add("1.0-RC1");
        versions.add("1.1");
        versions.add("1.2");
        versions.add("2.1-RC1");
        versions.add("2.1-RC2");
        versions.add("2.1-RC3");
        versions.add("3.1-RC1");
        versions.add("3.1");

        return versions;
    }
}
 类似资料:
  • 我只是好奇为什么Lucene不以标准的方式区分字符串和数值。。例如,范围查询的和,并在默认情况下将它们全部视为字符串。 是否有任何特殊原因将这两种情况都视为字符串值?

  • 要转义这些字符,请在字符前面使用\。例如,要搜索(1+1):2,请使用以下查询: 为此,我使用方法: 我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。 null

  • 使用Lucene libs,我需要对现有的搜索函数进行一些更改:假设以下对象: 名称:“端口对象1” 数据:"TCP(1)/1000-2000" 查询(或搜索文本)为“1142”,是否可以在数据字段内搜索“1142”并找到端口对象1,因为它指的是1000-2000之间的范围? 我只找到了数值范围查询,但这不适用于本例,因为我不知道范围。。。 参考以上代码。查询"1200"应该找到第一个doc。 L

  • 问题内容: 我正在尝试将范围查询与elasticsearch一起使用 但是弹性返回没有结果。我发现系统存在字符串包含或问题 这是该字段的映射: 问题答案:

  • 我有一个包含以下两个字段的Lucene 3.6.0索引(每个字段下面都有示例数据): 字段由多个代码字符串组成,例如“CHP-13724”或“RPS-204979”。 所以:在字段中,由于某种原因,它无法找到空格分隔的字符串,除非它是第一个字符串,并且在查询中使用了通配符,但是在company字段中,无论字符串出现在哪里,并且不使用通配符,它都可以找到。 编辑:字段使用not_analysis进行

  • 问题内容: 因此,我正在编写一个简单的程序来输入字符串并计算总数。的米 所以,这是我的代码 where 和str是我接受过的字符串,但是此错误不断出现 这是什么错误以及如何将其删除? 问题答案: 字符串,有效索引从0到n-1; 更改 至