gpt4 book ai didi

c# - 是否只有在Lucene.net中搜索词组才能找到完全匹配?

转载 作者:行者123 更新时间:2023-11-30 12:12:48 25 4
gpt4 key购买 nike

我知道已经有人问过类似的问题,但我找不到适合我所寻找的答案。

基本上,我想搜索短语,并且只返回具有该短语的匹配项,而不是部分匹配项。

例如如果我搜索“This is”,文档中包含“This is a phrase”的文档不会返回匹配项。

以这个例子为例:Exact Phrase search using Lucene?

“foo bar”不应返回命中,因为它只是部分匹配。我正在寻找的完整匹配项是“foo bar baz”。

这是代码,感谢 WhiteFang34 将其发布在上面的链接中(我已经简单地转换为 c#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Documents;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Analysis;
using Lucene.Net.Store;
using Lucene.Net.Index;

namespace LuceneStatic
{
public static class LuceneStatic
{
public static void LucenePhraseQuery()
{
// setup Lucene to use an in-memory index
Lucene.Net.Store.Directory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
var mlf = Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED;
IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf);

// index a few documents
writer.AddDocument(createDocument("1", "foo bar baz"));
writer.AddDocument(createDocument("2", "red green blue"));
writer.AddDocument(createDocument("3", "test foo bar test"));
writer.Close();

// search for documents that have "foo bar" in them
String sentence = "foo bar";
IndexSearcher searcher = new IndexSearcher(directory, true);
PhraseQuery query = new PhraseQuery();
string[] words = sentence.Split(' ');
foreach (var word in words)
{
query.Add(new Term("contents", word));
}

// display search results
List<string> results = new List<string>();
TopDocs topDocs = searcher.Search(query, 10);
foreach (ScoreDoc scoreDoc in topDocs.ScoreDocs)
{
Document doc = searcher.Doc(scoreDoc.doc);
results.Add(doc.Get("contents"));
}
}

private static Document createDocument(string id, string content)
{
Document doc = new Document();
doc.Add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("contents", content, Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
return doc;
}
}
}

我已经使用差异分析器和不同的方法解决了这个问题,但我无法获得所需的结果。我需要匹配完整短语“foo bar baz”,但“foo bar”应该返回任何匹配项。

最佳答案

在创建字段时使用 Field.Index.NOT_ANALYZED 参数为您的数据编制索引。这将导致整个值被索引为单个 Term

然后您可以使用简单的 TermQuery 对其进行搜索。

https://lucene.apache.org/core/old_versioned_docs/versions/3_0_1/api/all/org/apache/lucene/document/Field.Index.html#NOT_ANALYZED

关于c# - 是否只有在Lucene.net中搜索词组才能找到完全匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com