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

lucene-给予更多的权重,更接近标题开头的术语

陶征
2023-03-14
Query = "lucene"

Doc1 title = "Lucene: Homepage"
Doc2 title = "I have a question about lucene?"

我在Java中使用Lucene4.1。

共有1个答案

颜乐
2023-03-14

我将使用SpanFirstQuery,它匹配字段开头附近的术语。因为所有的span查询都依赖于位置,在Lucene中索引时默认启用。

让我们独立测试它:您只需提供spantermquery和可以找到该术语的最大位置(在我的示例中有一个)。

SpanTermQuery spanTermQuery = new SpanTermQuery(new Term("title", "lucene"));
SpanFirstQuery spanFirstQuery = new SpanFirstQuery(spanTermQuery, 1);

如果您使用StandardAnalyzer分析了这两个文档,那么该查询将只找到标题为“Lucene:homepage”的第一个文档。

Term term = new Term("title", "lucene");
TermQuery termQuery = new TermQuery(term);
SpanFirstQuery spanFirstQuery = new SpanFirstQuery(new SpanTermQuery(term), 1);
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new BooleanClause(termQuery, BooleanClause.Occur.MUST));
booleanQuery.add(new BooleanClause(spanFirstQuery, BooleanClause.Occur.SHOULD));
------ TermQuery --------
Total hits: 2
title: I have a question about lucene - score: 0.26010898
title: Lucene: I have a really hard question about it - score: 0.22295055
------ SpanFirstQuery --------
Total hits: 1
title: Lucene: I have a really hard question about it - score: 0.15764984
------ BooleanQuery: TermQuery (MUST) + SpanFirstQuery (SHOULD) --------
Total hits: 2
title: Lucene: I have a really hard question about it - score: 0.26912516
title: I have a question about lucene - score: 0.09196242
public static void main(String[] args) throws Exception {

        Directory directory = FSDirectory.open(new File("data"));

        index(directory);

        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        Term term = new Term("title", "lucene");

        System.out.println("------ TermQuery --------");
        TermQuery termQuery = new TermQuery(term);
        search(indexSearcher, termQuery);

        System.out.println("------ SpanFirstQuery --------");
        SpanFirstQuery spanFirstQuery = new SpanFirstQuery(new SpanTermQuery(term), 1);
        search(indexSearcher, spanFirstQuery);

        System.out.println("------ BooleanQuery: TermQuery (MUST) + SpanFirstQuery (SHOULD) --------");
        BooleanQuery booleanQuery = new BooleanQuery();
        booleanQuery.add(new BooleanClause(termQuery, BooleanClause.Occur.MUST));
        booleanQuery.add(new BooleanClause(spanFirstQuery, BooleanClause.Occur.SHOULD));
        search(indexSearcher, booleanQuery);
    }

    private static void index(Directory directory) throws Exception {
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_41, new StandardAnalyzer(Version.LUCENE_41));

        IndexWriter writer = new IndexWriter(directory, config);

        FieldType titleFieldType = new FieldType();
        titleFieldType.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
        titleFieldType.setIndexed(true);
        titleFieldType.setStored(true);

        Document document = new Document();
        document.add(new Field("title","I have a question about lucene", titleFieldType));
        writer.addDocument(document);

        document = new Document();
        document.add(new Field("title","Lucene: I have a really hard question about it", titleFieldType));
        writer.addDocument(document);

        writer.close();
    }

    private static void search(IndexSearcher indexSearcher, Query query) throws Exception {
        TopDocs topDocs = indexSearcher.search(query, 10);

        System.out.println("Total hits: " + topDocs.totalHits);

        for (ScoreDoc hit : topDocs.scoreDocs) {
            Document result = indexSearcher.doc(hit.doc);
            for (IndexableField field : result) {
                System.out.println(field.name() + ": " + field.stringValue() +  " - score: " + hit.score);
            }
        }
    }
 类似资料:
  • 我正在努力学习和编写elasticsearch查询。我意识到有一个“exists”字段返回指定字段exists或not的文档。为了了解,我编写了一个简单的查询,我想学习更多和玩查询结构。

  • 我有一个使用< code>jwt进行身份验证的< code>api。我正在为一个< code>vuejs应用程序使用这个api。我试图在应用程序中显示图像,使用 但是需要header,其中包含 。 我可以像这样在浏览器请求中添加标题吗(这里回答的几个问题让我相信这是不可能的)? 有没有办法(使用js)或者我应该改变<code>api</code>本身?

  • 问题内容: 我看了文件。 但我想我一定误会了。 我也尝试过 我想更改为 都不起作用。 问题答案: 使用JSONP时,无法控制浏览器发送的标头。JSONP是一个聪明的把戏(或者是一个hack,具体取决于您对它的看法…),其中包括插入指向服务器端点的标记。最终,这是一个浏览器,它会在通过标签请求脚本时决定要发送的标头,并且您不能影响它。

  • 我想使用Solr对带有术语权重的文档进行索引。 doc1:这(w=0.3)是(w=0.4)第一个(w=0.7)文件(w=0.2) doc2:这个(w=0.1)是(w=0.2)第二个(w=0.8)doc(w=0.1)

  • 问题内容: 我正在尝试更新数据库中的一堆列,以测试功能。我有一个使用休眠模式构建的表,因此为嵌入式实体创建的所有列均以相同的名称开头。即,等等。 我试图找出是否有办法对以下事情产生影响: 如果没有,我知道我可以做很长的路要走,如果我需要针对另一组不同的栏目再次进行此操作,则只是寻找一种将来可以帮助自己的方法。 问题答案: 没有方便的快捷方式,对不起。如果您必须做很多这样的事情,则可以创建一个函数来

  • 假设我有两组对象“Questions”和“Users”,它们共享一个关系。 什么是最好的方法索引我的对象,以允许最新的变化反映在lucene IDEX? 是否应该为用户和问题提供单独的文档,并让lucene根据需要获取所需的问题/用户详细信息? 还是,走数据传输对象的方式?当发生更改时,只需删除这些文档并重新索引?