使用StringField创建索引查询不到问题

今天使用lucene4.7.0版本创建索引和查询功能,创建索引过程中使用StringField,创建完成后怎么也查询不出内容,结果最后发现StringField的默认构造函数不会分词,所以换成TextField类就可以了。TextField类默认构造函数会分词

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene 是一个全文搜索引擎框架,它主要用于对文本内容进行索引和搜索,不直接涉及员权重机制的设计。但是,我们可以借助 Lucene 实现一个基于搜索结果的员权重机制。 具体实现思路如下: 1. 首先需要在 Lucene 中建立索引,将员数据以及相应的权重信息添加到索引中。 2. 在用户进行搜索时,根据搜索关键词进行查询,并将查询结果按照相关性排序。 3. 在排序后的结果中,对于每个员,根据其权重信息进行加权计算,得到最终权重值。 4. 将最终权重值作为该员在搜索结果中的权重值,可以根据该权重值对搜索结果进行再排序,以提高与用户搜索意图相关的员排名。 下面是一个简单的示例代码,假设我们有一个员数据集合 members,包含每个员的名称和权重信息,我们要根据用户的搜索关键词 query 进行查询,并对搜索结果进行员权重计算。 ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.FloatField; import org.apache.lucene.document.StringField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; import org.apache.lucene.search.similarities.ClassicSimilarity; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MemberSearcher { private static final Version VERSION = Version.LUCENE_8_8_0; private final Directory directory; private final IndexSearcher searcher; public MemberSearcher(List<Member> members) throws IOException { // 创建内存型索引 directory = new RAMDirectory(); // 创建索引写入器 IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer()); IndexWriter writer = new IndexWriter(directory, config); // 将员数据添加到索引中 for (Member member : members) { Document doc = new Document(); doc.add(new StringField("name", member.getName(), Field.Store.YES)); doc.add(new FloatField("weight", member.getWeight(), Field.Store.YES)); writer.addDocument(doc); } writer.close(); // 创建索引搜索器 searcher = new IndexSearcher(directory); searcher.setSimilarity(new ClassicSimilarity()); // 设置相似度计算器 } public List<String> search(String query) throws Exception { List<String> results = new ArrayList<>(); // 创建查询对象 Query q = new QueryParser("name", new StandardAnalyzer()).parse(query); // 执行查询并获取结果 TopDocs docs = searcher.search(q, 10); TotalHits totalHits = docs.totalHits; ScoreDoc[] hits = docs.scoreDocs; // 对搜索结果进行员权重计算 for (ScoreDoc hit : hits) { Document doc = searcher.doc(hit.doc); float weight = doc.getField("weight").numericValue().floatValue(); float score = hit.score; float finalScore = weight * score; // 计算最终权重值 results.add(doc.get("name") + ": " + finalScore); } return results; } public static void main(String[] args) throws Exception { List<Member> members = new ArrayList<>(); members.add(new Member("Tom", 0.8f)); members.add(new Member("Jerry", 0.7f)); members.add(new Member("Alice", 0.9f)); members.add(new Member("Bob", 0.6f)); MemberSearcher searcher = new MemberSearcher(members); List<String> results = searcher.search("Tom"); for (String result : results) { System.out.println(result); } } private static class Member { private final String name; private final float weight; public Member(String name, float weight) { this.name = name; this.weight = weight; } public String getName() { return name; } public float getWeight() { return weight; } } } ``` 在上面的示例代码中,我们将员数据集合 members 添加到内存型索引中,并将每个员的名称和权重信息分别存储为 StringField 和 FloatField 类型的字段。在查询时,我们创建一个 Query 对象,并执行搜索操作,获取搜索结果列表。对于每个搜索结果,我们通过其文档编号获取该员的权重信息,并计算最终权重值。最后,我们将每个员的名称和最终权重值拼接成字符串,并存储到结果列表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值