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

Lucene LongPoint范围搜索不起作用

曾云
2023-03-14

我正在使用Lucene 8.2。Java11中的0。

我试图索引一个Long值,以便我可以使用范围查询过滤它,例如:my_range_field:[1 TO 200]。然而,任何变体,甚至my_range_field:[*TO*],返回0都会导致这个最小的示例。一旦我从其中删除使其成为OR,我就会得到2结果。

所以我在想我一定是在索引上犯了一个错误,但是我不知道它可能是什么。

LongPointJavaDoc:

用于快速范围过滤器的索引长字段。如果还需要存储该值,则应添加一个单独的StoredField实例。在搜索时查找N维形状或范围内的所有文档是有效的。一个文档中的同一字段允许有多个值。

这是我最简单的例子:

public static void main(String[] args) {
    Directory index = new RAMDirectory();
    StandardAnalyzer analyzer = new StandardAnalyzer();

    try {
        IndexWriter indexWriter = new IndexWriter(index, new IndexWriterConfig(analyzer));

        Document document1= new Document();
        Document document2= new Document();

        document1.add(new LongPoint("my_range_field", 10));
        document1.add(new StoredField("my_range_field", 10));
        document2.add(new LongPoint("my_range_field", 100));
        document2.add(new StoredField("my_range_field", 100));

        document1.add(new TextField("my_text_field", "test content 1", Field.Store.YES));
        document2.add(new TextField("my_text_field", "test content 2", Field.Store.YES));

        indexWriter.deleteAll();
        indexWriter.commit();
        indexWriter.addDocument(document1);
        indexWriter.addDocument(document2);
        indexWriter.commit();
        indexWriter.close();

        QueryParser parser = new QueryParser("text", analyzer);
        IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(index));

        String luceneQuery = "+my_text_field:test* +my_range_field:[1 TO 200]";
        Query query = parser.parse(luceneQuery);

        System.out.println(indexSearcher.search(query, 10).totalHits.value);
    } catch (IOException e) {

    } catch (ParseException e) {

    }
}

共有1个答案

充浩波
2023-03-14

我找到了解决问题的办法。

我的印象是查询解析器可以正确解析任何查询字符串。情况似乎并非如此。

使用

Query rangeQuery = LongPoint.newRangeQuery("my_range_field", 1L, 11L);
Query searchQuery = new WildcardQuery(new Term("my_text_field", "test*"));
Query build = new BooleanQuery.Builder()
    .add(searchQuery, BooleanClause.Occur.MUST)
    .add(rangeQuery, BooleanClause.Occur.MUST)
    .build();

返回正确的结果。

 类似资料:
  • 本文向大家介绍solr范围搜索,包括了solr范围搜索的使用技巧和注意事项,需要的朋友参考一下 示例 age:[50 TO 60] 匹配年龄在50和60之间(包括50和60)的文档 age:{50 TO 60} 匹配年龄在50到60之间(不包括50到60)的文档 age:[* TO 60] 匹配年龄小于或等于60的文档 age:[50 TO *] 匹配年龄大于或等于50的文档 age:{50 to

  • 问题内容: 在elasticsearch中,我们有两个字段:街道编号1和街道编号2。我们在Elastic Search中还有一个Address字段,而Address是2个字段与其他一些字段的组合。因此,我们的地址为: 1604-1612卡尔弗大厦 1608- 1645公园别墅 如果用户使用1610搜索,则应同时返回该地址。 有关如何形成查询的任何帮助? 问题答案: 想法是利用数据类型并将最小和最大

  • 我使用的elasticsearch版本是ES2.2。我为全文搜索键入与官方教程相同的代码。(https://www.elastic.co/guide/en/elasticsearch/guide/current/match-query.html) 看来全文对我不起作用。我的设定有什么问题?谢谢! 我键入的代码如下: 返回的结果是: 当我输入精确的查询时,我只能得到一次命中,该查询存储在索引中。 输

  • 问题内容: 为什么结果是 不: 我们不能在范围内使用指针?这是代码,我设置了一个指针,该指针指向范围循环,但是失败了。 问题答案: 该变量设置为指向,而不是slice元素。这段代码设置为指向slice元素: 游乐场的例子

  • Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm’s runtime complexity must be in the order of O(log n). If the target is not found in the

  • 我试图过滤查询使用范围按日期,但它不工作。如果我使用gt, gte, lt, lte它返回零结果。如果我只使用gt或lt,它返回一些结果,但过滤器不工作。 我检查了uri上的数据类型http://mydomain.local:9200/logstash-2014.09.09/_mapping?pretty=true字段类型是正确的: 以下是我在ElasticSearch中索引的结果示例: 下面是我