- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
实现Lucene和 Tika Apache 库包并设法使其能够很好地满足我的需求。但我在单词中遇到重音问题,它无法返回带重音单词的结果。
Indexador.java
package br.com.ir;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.br.BrazilianAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.apache.tika.Tika;
import javax.swing.*;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.text.SimpleDateFormat;
class Indexador {
private static final Logger logger = Logger.getLogger(Indexador.class);
private IndexWriter writer;
private Tika tika;
private int qntArq = 0;
public void iniciaIndexacao() {
try {
File diretorio = new File(ArquivoDeConfiguracao.retornaValorIndice());
apagaIndices(diretorio);
Directory d = new SimpleFSDirectory(diretorio);
BrazilianAnalyzer analyzer = new BrazilianAnalyzer(Version.LUCENE_4_9);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,
analyzer);
writer = new IndexWriter(d, config);
long inicio = System.currentTimeMillis();
indexaArquivosDoDiretorio(new File(ArquivoDeConfiguracao.retornaValorFonte()));
// Fecha o IndexWriter e comita as mudanças
writer.commit();
long fim = System.currentTimeMillis();
JOptionPane.showMessageDialog(
null,
"Quantidade de arquivos indexados: " + qntArq + "\n"
+ "Tempo para indexar: "
+ String.valueOf((fim - inicio) / 1000) + "s"
);
} catch (IOException e) {
logger.error(e);
} finally {
if (writer != null) try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void apagaIndices(File diretorio) {
if (diretorio.exists()) {
File arquivos[] = diretorio.listFiles();
if (arquivos != null) {
for (File arquivo : arquivos) {
arquivo.delete();
}
}
}
}
void indexaArquivosDoDiretorio(File raiz) {
FilenameFilter filtro = new FilenameFilter() {
public boolean accept(File arquivo, String nome) {
return nome.toLowerCase().endsWith(".pdf")
|| nome.toLowerCase().endsWith(".odt")
|| nome.toLowerCase().endsWith(".doc")
|| nome.toLowerCase().endsWith(".docx")
|| nome.toLowerCase().endsWith(".ppt")
|| nome.toLowerCase().endsWith(".pptx")
|| nome.toLowerCase().endsWith(".xls")
|| nome.toLowerCase().endsWith(".xlsx")
|| nome.toLowerCase().endsWith(".txt")
|| nome.toLowerCase().endsWith(".rtf")
|| nome.toLowerCase().endsWith("");
}
};
for (File arquivo : raiz.listFiles(filtro)) {
if (arquivo.isFile()) {
try {
String textoExtraido = getTika().parseToString(arquivo);
indexaArquivo(arquivo, textoExtraido);
qntArq++;
} catch (Exception e) {
logger.error(e);
}
} else {
indexaArquivosDoDiretorio(arquivo);
}
}
}
private void indexaArquivo(File arquivo, String textoExtraido) {
SimpleDateFormat formatador = new SimpleDateFormat("ddMMyyyy");
String ultimaModificacao = formatador.format(arquivo.lastModified());
Document documento = new Document();
documento.add(new TextField("UltimaModificacao", ultimaModificacao,
Field.Store.YES));
documento.add(new TextField("Caminho", arquivo.getAbsolutePath(),
Field.Store.YES));
documento.add(new TextField("Texto", textoExtraido, Field.Store.YES));
try {
getWriter().addDocument(documento);
} catch (IOException e) {
logger.error(e);
}
}
Tika getTika() {
if (tika == null) {
tika = new Tika();
}
return tika;
}
IndexWriter getWriter() {
return writer;
}
}
Buscador.java
package br.com.ir;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
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.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import javax.swing.*;
import java.io.File;
class Buscador {
private final static Logger logger = Logger.getLogger(Buscador.class);
public int totalDeOcorrencias;
public String quantBusca;
@SuppressWarnings({"unchecked", "rawtypes"})
public Buscador(String parametro, DefaultListModel listModel) {
try {
Directory diretorio = new SimpleFSDirectory(new File(
ArquivoDeConfiguracao.retornaValorIndice()));
// IndexReader: classe abstrata responsável por acessar
// o índice;
IndexReader leitor = DirectoryReader.open(diretorio);
// IndexSearcher: implementa os métodos necessários para
// realizar buscas em um índice;
IndexSearcher buscador = new IndexSearcher(leitor);
Analyzer analisador = new StandardAnalyzer(Version.LUCENE_4_9);
// QueryParser/Query: representa a consulta do usuário. Outros
// exemplos de query podem ser vistos no Javadoc;
QueryParser parser = new QueryParser(Version.LUCENE_4_9, "Texto",
analisador);
Query consulta = parser.parse(parametro);
long inicio = System.currentTimeMillis();
// Realiza a busca e armazena o resultado em um TopDocs;
TopDocs resultado = buscador.search(consulta, 100);
long fim = System.currentTimeMillis();
totalDeOcorrencias = resultado.totalHits;
quantBusca = String.valueOf((fim - inicio) / 1000);
// ScoreDoc: representa cada um dos documentos retornados na busca.
for (ScoreDoc sd : resultado.scoreDocs) {
Document documento = buscador.doc(sd.doc);
// Preenche o modelo
listModel.addElement(documento.get("Caminho"));
}
leitor.close();
} catch (Exception e) {
logger.error(e);
}
}
}
Indexador.java 是在目录中搜索文件并在文件中对其进行索引的类。然后,我使用 Buscador.java 执行搜索,但是当我尝试搜索“plástico”或“coração”等单词(假设有包含这些单词的文件)时,它不会向我返回任何内容。
最佳答案
您在索引时使用 BrazilianAnalyzer
,我认为它对重音单词(以及词干分析器)有一些特定的处理,并且您在以下位置使用 StandardAnalyzer
查询时间,没有那些特定于语言的增强功能。
要解决此问题,请使用相同的分析器。可能 BrazilianAnalyzer
是您想要的方式,因此,在 Buscador.java 中,更改为:
Analyzer analisador = new BrazilianAnalyzer(Version.LUCENE_4_9);
QueryParser parser = new QueryParser(Version.LUCENE_4_9, "Texto", analisador);
您通常应该使用相同的分析器、索引和搜索时间(除非您有充分的理由不这样做)。
关于java - 无法在 Lucene+Tika 上返回带有重音符号的单词的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825662/
我运行一个未修改的 Apache tika-server 1.22 的 JAX-RS 实例,并将其用作 HTTP 端点服务,我将文件发布到(主要是 Office、PDF 和 RTF)并通过 HTTP
我们当前的 Scala 代码与 Tika 1.13+ 一起运行,我们使用现已弃用的 LanguageIdentifier 代码,如下所示: import org.apache.tika.languag
使用Apache Tika提取JPEG图片元数据时遇到如下错误 java.lang.NoSuchMethodError: com.adobe.xmp.properties.XMPPropertyInf
我在网上找到了以下示例源代码,它的名称为 MyFirstTika.java,但我无法确定使用哪个版本的 Tika 来编译它。或者 Tika 的所有版本都兼容吗? The code is linked
我正在使用 Tika 阅读 PDF,并且我的代码直到昨天才正常工作。现在,当我运行相同的代码时,我收到错误,并且显然 Tika 找不到 Tika 服务器 jar 文件。我正在使用以下代码来阅读 PDF
Apache Tika 服务器提供了一个 Rest API 来从文档中提取文本。也可以设置特定的请求 header 参数,例如 X-Tika-PDFOcrStrategy。例如: $ curl -T
我在评论中添加了RTF文件。在文本编辑器中复制以下文本并另存为RTF格式。 BodyContentHandler handler = new BodyContentHandler(); Metadat
我想在 Maven 项目中使用 Tika 作为依赖项,从文件中提取元数据。当我使用 mvn exec:java 运行该类时它工作正常,但使用 java -cp 运行该类时它工作正常,所以我怀疑这是一个
对于 docx 文件,我检索 application/x-tika-ooxml,但我应该检索 application/vnd.openxmlformats-officedocument.wordpro
对于 docx 文件,我检索 application/x-tika-ooxml,但我应该检索 application/vnd.openxmlformats-officedocument.wordpro
我正在尝试使用 tika 包来解析文件。 Tika 已成功安装,tika-server-1.18.jar 使用 cmd 中的代码运行 Java -jar tika-server-1.18.jar 我在
我使用 jersey 框架在 java 中编写了一个 Web 服务,该框架使用了我的 apache tika 包装器。该包装器包装了 tika-app-1.7.jar。我的问题是什么是最好的方法:包装
我正在尝试在 Nutch 中启用 Tika 的 BoilerpipeContentHandler 解析器,以从网页中提取文章文本。为此,我配置了 tika-config.xml 以排除 HTMLPar
我正在尝试解析一些包含工程图纸的 PDF 文件以获取文件中的文本数据。我尝试将 TIKA 用作 python 的 jar,并将其与 jnius 包一起使用(在此处使用本教程: http://www.h
在 Tika 的网站上,它说(关于 tika-app-1.2.jar)它可以在服务器模式下使用。有谁知道如何在该服务器运行后发送文档并从该服务器接收解析的文本? 最佳答案 Tika 支持两种“服务器”
我正在使用 Tika 解析大型 pdf 和 word 文档,但我收到以下错误消息。 Your document contained more than 100000 characters, and s
我正在使用 Apache Tika 从 PDF 文件获取内容。 当我运行它时,出现以下错误。我没有在任何地方看到这个错误的记录,这只是一个糟糕的惊喜。 org.apache.tika.sax.Writ
我知道 Tika 有一个非常好的包装器,它让我可以像这样从解析文件中获取一个 Reader: Reader parsedReader = tika.parse(in); 但是,如果我使用它,我无法指定
我阅读了一些文章,认为服务器模式下的 tika 可以提高性能。有人能解释一下怎么做吗?我们能否在 Java 应用程序中实现类似的功能以获得更好的性能? Running tika in server m
在我们的应用程序中,我们使用 Apache Tika 处理文件。但是有一些文件(例如*.mov,*.mp4)Tika无法处理并在用户的Temp文件夹中留下相应的*.tmp文件。经过一些研究,我发现这是
我是一名优秀的程序员,十分优秀!