├── .idea ├── vcs.xml ├── modules.xml ├── everywhere.iml └── workspace.xml ├── parser ├── text.rs ├── pdf.rs └── mod.rs ├── README.md ├── main.rs ├── app.rs ├── Cargo.toml ├── search ├── indexer.rs └── engine.rs ├── main_window.rs └── CHANGELOG.md /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /parser/text.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | use anyhow::Result; 3 | use tokio::fs; 4 | 5 | pub async fn extract_text(path: &Path) -> Result { 6 | let content = fs::read_to_string(path).await?; 7 | Ok(content) 8 | } -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/everywhere.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /parser/pdf.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | use anyhow::Result; 3 | use tokio::task; 4 | 5 | pub async fn extract_text(path: &Path) -> Result { 6 | let path = path.to_owned(); 7 | task::spawn_blocking(move || { 8 | let bytes = std::fs::read(&path)?; 9 | let content = pdf_extract::extract_text_from_mem(&bytes)?; 10 | Ok(content) 11 | }).await? 12 | } -------------------------------------------------------------------------------- /parser/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod pdf; 2 | pub mod docx; 3 | pub mod text; 4 | 5 | use std::path::Path; 6 | use anyhow::Result; 7 | 8 | pub async fn parse_pdf(path: &Path) -> Result { 9 | pdf::extract_text(path).await 10 | } 11 | 12 | pub async fn parse_docx(path: &Path) -> Result { 13 | docx::extract_text(path).await 14 | } 15 | 16 | pub async fn parse_text(path: &Path) -> Result { 17 | text::extract_text(path).await 18 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # everywhere :mag: 2 | 3 | The name is inspired by everything, an awesome tool to search files in your PC. But the limitation is it can only search for filename. Recently, I am developing a tool to scan the documents in PC to search for some specific kind of data. A idea hits me that if I can develop a tool where I can search the content of files. It is the creation of this tool. 4 | 5 | ready to switch to Rust 6 | 7 | # Licene 8 | [Apache License 2.0](https://github.com/madneal/everywhere/blob/master/LICENSE) 9 | -------------------------------------------------------------------------------- /main.rs: -------------------------------------------------------------------------------- 1 | use eframe::egui; 2 | use std::sync::Arc; 3 | use tokio::sync::Mutex; 4 | 5 | mod app; 6 | mod search; 7 | mod parser; 8 | mod ui; 9 | mod utils; 10 | 11 | use app::DocumentSearchApp; 12 | 13 | #[tokio::main] 14 | async fn main() -> Result<(), Box> { 15 | // 初始化日志 16 | tracing_subscriber::fmt::init(); 17 | 18 | // 创建应用 19 | let app = DocumentSearchApp::new().await?; 20 | 21 | // 启动GUI 22 | let options = eframe::NativeOptions { 23 | viewport: egui::ViewportBuilder::default() 24 | .with_inner_size([1200.0, 800.0]) 25 | .with_title("文档搜索器"), 26 | ..Default::default() 27 | }; 28 | 29 | eframe::run_native( 30 | "Document Search", 31 | options, 32 | Box::new(|_cc| Box::new(app)), 33 | ) 34 | .map_err(|e| e.into()) 35 | } -------------------------------------------------------------------------------- /app.rs: -------------------------------------------------------------------------------- 1 | use crate::search::{SearchEngine, DocumentIndexer}; 2 | use crate::ui::MainWindow; 3 | use std::sync::Arc; 4 | use tokio::sync::Mutex; 5 | use anyhow::Result; 6 | 7 | pub struct DocumentSearchApp { 8 | main_window: MainWindow, 9 | search_engine: Arc, 10 | indexer: Arc, 11 | } 12 | 13 | impl DocumentSearchApp { 14 | pub async fn new() -> Result { 15 | let search_engine = Arc::new(SearchEngine::new("./index")?); 16 | let indexer = Arc::new(DocumentIndexer::new(search_engine.clone())); 17 | let main_window = MainWindow::new(search_engine.clone()); 18 | 19 | Ok(Self { 20 | main_window, 21 | search_engine, 22 | indexer, 23 | }) 24 | } 25 | } 26 | 27 | impl eframe::App for DocumentSearchApp { 28 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { 29 | self.main_window.update(ctx); 30 | } 31 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "everywhere" 3 | version = "0.22.0" 4 | authors = ["Paul Masurel "] 5 | 6 | description = """Command line interface for Tantivy, a search engine library.""" 7 | documentation = "https://github.com/madneal/everywhere" 8 | homepage = "https://github.com/madneal/everywhere" 9 | repository = "https://github.com/madneal/everywhere" 10 | 11 | readme = "README.md" 12 | keywords = ["search", "information", "retrieval"] 13 | license = "MIT" 14 | edition = "2021" 15 | 16 | [dependencies] 17 | time = "0.3" 18 | iron = "0.6" 19 | staticfile = "0.5" 20 | serde = "1.0" 21 | serde_derive = "1.0" 22 | serde_json = "1.0" 23 | persistent = "0.4" 24 | clap = "4" 25 | ansi_term = "0.12" 26 | urlencoded = "0.6" 27 | mount = "0.4" 28 | log = "0.4" 29 | env_logger = "0.10" 30 | tantivy = { git = "https://github.com/quickwit-oss/tantivy/", rev = "5b1bf1a"} 31 | crossbeam-channel = "0.5.8" 32 | 33 | [[bin]] 34 | name = "tantivy" 35 | path = "src/main.rs" 36 | 37 | 38 | [profile.release] 39 | opt-level = 3 40 | debug = true 41 | debug-assertions = false -------------------------------------------------------------------------------- /search/indexer.rs: -------------------------------------------------------------------------------- 1 | use crate::parser::{parse_pdf, parse_docx, parse_text}; 2 | use crate::search::engine::SearchEngine; 3 | use tantivy::{doc, IndexWriter}; 4 | use std::path::{Path, PathBuf}; 5 | use walkdir::WalkDir; 6 | use anyhow::Result; 7 | use tokio::fs; 8 | 9 | pub struct DocumentIndexer { 10 | engine: SearchEngine, 11 | } 12 | 13 | impl DocumentIndexer { 14 | pub fn new(engine: SearchEngine) -> Self { 15 | Self { engine } 16 | } 17 | 18 | pub async fn index_directory(&self, dir_path: &Path) -> Result<()> { 19 | let mut writer = self.engine.get_writer()?; 20 | 21 | for entry in WalkDir::new(dir_path).follow_links(true) { 22 | let entry = entry?; 23 | if entry.file_type().is_file() { 24 | if let Some(extension) = entry.path().extension() { 25 | match extension.to_str() { 26 | Some("pdf") => self.index_pdf(&mut writer, entry.path()).await?, 27 | Some("docx") => self.index_docx(&mut writer, entry.path()).await?, 28 | Some("txt") | Some("md") => self.index_text(&mut writer, entry.path()).await?, 29 | _ => continue, 30 | } 31 | } 32 | } 33 | } 34 | 35 | writer.commit()?; 36 | tracing::info!("索引构建完成"); 37 | Ok(()) 38 | } 39 | 40 | async fn index_pdf(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> { 41 | tracing::info!("索引PDF文件: {:?}", path); 42 | let content = parse_pdf(path).await?; 43 | let title = path.file_stem() 44 | .and_then(|s| s.to_str()) 45 | .unwrap_or("Unknown") 46 | .to_string(); 47 | 48 | writer.add_document(doc!( 49 | self.engine.title_field => title, 50 | self.engine.content_field => content, 51 | self.engine.path_field => path.to_string_lossy().to_string(), 52 | ))?; 53 | 54 | Ok(()) 55 | } 56 | 57 | async fn index_docx(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> { 58 | tracing::info!("索引DOCX文件: {:?}", path); 59 | let content = parse_docx(path).await?; 60 | let title = path.file_stem() 61 | .and_then(|s| s.to_str()) 62 | .unwrap_or("Unknown") 63 | .to_string(); 64 | 65 | writer.add_document(doc!( 66 | self.engine.title_field => title, 67 | self.engine.content_field => content, 68 | self.engine.path_field => path.to_string_lossy().to_string(), 69 | ))?; 70 | 71 | Ok(()) 72 | } 73 | 74 | async fn index_text(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> { 75 | tracing::info!("索引文本文件: {:?}", path); 76 | let content = parse_text(path).await?; 77 | let title = path.file_stem() 78 | .and_then(|s| s.to_str()) 79 | .unwrap_or("Unknown") 80 | .to_string(); 81 | 82 | writer.add_document(doc!( 83 | self.engine.title_field => title, 84 | self.engine.content_field => content, 85 | self.engine.path_field => path.to_string_lossy().to_string(), 86 | ))?; 87 | 88 | Ok(()) 89 | } 90 | } -------------------------------------------------------------------------------- /main_window.rs: -------------------------------------------------------------------------------- 1 | use crate::search::{SearchEngine, SearchResult}; 2 | use std::sync::Arc; 3 | use egui::{Context, TopBottomPanel, CentralPanel, ScrollArea}; 4 | 5 | pub struct MainWindow { 6 | search_engine: Arc, 7 | search_query: String, 8 | search_results: Vec, 9 | is_searching: bool, 10 | } 11 | 12 | impl MainWindow { 13 | pub fn new(search_engine: Arc) -> Self { 14 | Self { 15 | search_engine, 16 | search_query: String::new(), 17 | search_results: Vec::new(), 18 | is_searching: false, 19 | } 20 | } 21 | 22 | pub fn update(&mut self, ctx: &Context) { 23 | // 顶部搜索栏 24 | TopBottomPanel::top("search_panel").show(ctx, |ui| { 25 | ui.horizontal(|ui| { 26 | ui.label("搜索: "); 27 | let response = ui.text_edit_singleline(&mut self.search_query); 28 | 29 | if ui.button("🔍 搜索").clicked() || 30 | (response.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter))) { 31 | self.perform_search(); 32 | } 33 | 34 | if ui.button("📁 选择目录索引").clicked() { 35 | if let Some(path) = rfd::FileDialog::new().pick_folder() { 36 | // 异步索引目录 37 | self.index_directory(path); 38 | } 39 | } 40 | }); 41 | }); 42 | 43 | // 中央搜索结果区域 44 | CentralPanel::default().show(ctx, |ui| { 45 | if self.is_searching { 46 | ui.spinner(); 47 | ui.label("搜索中..."); 48 | } else { 49 | ScrollArea::vertical().show(ui, |ui| { 50 | for result in &self.search_results { 51 | ui.group(|ui| { 52 | ui.heading(&result.title); 53 | ui.label(format!("路径: {}", result.path.display())); 54 | ui.label(format!("评分: {:.2}", result.score)); 55 | ui.separator(); 56 | ui.label(&result.content); 57 | 58 | if ui.button("📖 打开文件").clicked() { 59 | self.open_file(&result.path); 60 | } 61 | }); 62 | ui.separator(); 63 | } 64 | }); 65 | } 66 | }); 67 | } 68 | 69 | fn perform_search(&mut self) { 70 | if self.search_query.trim().is_empty() { 71 | return; 72 | } 73 | 74 | self.is_searching = true; 75 | match self.search_engine.search(&self.search_query, 20) { 76 | Ok(results) => { 77 | self.search_results = results; 78 | } 79 | Err(e) => { 80 | tracing::error!("搜索失败: {}", e); 81 | } 82 | } 83 | self.is_searching = false; 84 | } 85 | 86 | fn index_directory(&self, path: std::path::PathBuf) { 87 | // 这里需要异步处理,实际实现中可以使用消息传递 88 | tracing::info!("开始索引目录: {:?}", path); 89 | } 90 | 91 | fn open_file(&self, path: &std::path::Path) { 92 | if let Err(e) = opener::open(path) { 93 | tracing::error!("无法打开文件: {}", e); 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /search/engine.rs: -------------------------------------------------------------------------------- 1 | use tantivy::*; 2 | use tantivy::query::QueryParser; 3 | use tantivy::collector::TopDocs; 4 | use std::path::PathBuf; 5 | use anyhow::Result; 6 | use serde::{Deserialize, Serialize}; 7 | 8 | #[derive(Debug, Clone, Serialize, Deserialize)] 9 | pub struct SearchResult { 10 | pub title: String, 11 | pub content: String, 12 | pub path: PathBuf, 13 | pub score: f32, 14 | } 15 | 16 | pub struct SearchEngine { 17 | index: Index, 18 | reader: IndexReader, 19 | query_parser: QueryParser, 20 | title_field: Field, 21 | content_field: Field, 22 | path_field: Field, 23 | } 24 | 25 | impl SearchEngine { 26 | pub fn new(index_path: &str) -> Result { 27 | // 创建schema 28 | let mut schema_builder = Schema::builder(); 29 | let title_field = schema_builder.add_text_field("title", TEXT | STORED); 30 | let content_field = schema_builder.add_text_field("content", TEXT); 31 | let path_field = schema_builder.add_text_field("path", STRING | STORED); 32 | let schema = schema_builder.build(); 33 | 34 | // 创建或打开索引 35 | let index_path = std::path::Path::new(index_path); 36 | let index = if index_path.exists() { 37 | Index::open_in_dir(index_path)? 38 | } else { 39 | std::fs::create_dir_all(index_path)?; 40 | Index::create_in_dir(index_path, schema.clone())? 41 | }; 42 | 43 | let reader = index.reader()?; 44 | let query_parser = QueryParser::for_index(&index, vec![title_field, content_field]); 45 | 46 | Ok(Self { 47 | index, 48 | reader, 49 | query_parser, 50 | title_field, 51 | content_field, 52 | path_field, 53 | }) 54 | } 55 | 56 | pub fn search(&self, query_str: &str, limit: usize) -> Result> { 57 | let searcher = self.reader.searcher(); 58 | let query = self.query_parser.parse_query(query_str)?; 59 | let top_docs = searcher.search(&query, &TopDocs::with_limit(limit))?; 60 | 61 | let mut results = Vec::new(); 62 | for (_score, doc_address) in top_docs { 63 | let retrieved_doc = searcher.doc(doc_address)?; 64 | 65 | let title = retrieved_doc 66 | .get_first(self.title_field) 67 | .and_then(|f| f.as_text()) 68 | .unwrap_or("") 69 | .to_string(); 70 | 71 | let path_str = retrieved_doc 72 | .get_first(self.path_field) 73 | .and_then(|f| f.as_text()) 74 | .unwrap_or("") 75 | .to_string(); 76 | 77 | // 获取匹配的内容片段 78 | let content = self.get_snippet(&searcher, &query, doc_address)?; 79 | 80 | results.push(SearchResult { 81 | title, 82 | content, 83 | path: PathBuf::from(path_str), 84 | score: _score, 85 | }); 86 | } 87 | 88 | Ok(results) 89 | } 90 | 91 | fn get_snippet(&self, searcher: &Searcher, query: &dyn Query, doc_address: DocAddress) -> Result { 92 | let snippet_generator = SnippetGenerator::create(searcher, query, self.content_field)?; 93 | let doc = searcher.doc(doc_address)?; 94 | let snippet = snippet_generator.snippet_from_doc(&doc); 95 | Ok(snippet.to_html()) 96 | } 97 | 98 | pub fn get_writer(&self) -> Result { 99 | Ok(self.index.writer(50_000_000)?) 100 | } 101 | } -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 26 | 27 | 28 | 30 | 31 | 33 | 34 | 36 | { 37 | "associatedIndex": 4 38 | } 39 | 40 | 41 | 42 | 43 | 44 | 47 | 67 | 68 | 69 | 81 | 82 | 83 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 1538713669351 93 | 110 | 111 | 1539476588013 112 | 117 | 118 | 1539477789542 119 | 124 | 125 | 1539478383935 126 | 131 | 132 | 1539525774819 133 | 138 | 139 | 146 | 149 | 150 | 152 | 153 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 163 | 164 | 165 | 166 | tree.getCommonRoot() 167 | JAVA 168 | EXPRESSION 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 183 | 184 | 185 | 186 | 187 | 188 | No facets are configured 189 | 190 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 206 | 207 | 208 | 209 | 210 | 211 | 1.8 212 | 213 | 218 | 219 | 220 | 221 | 222 | 223 | ui 224 | 225 | 230 | 231 | 232 | 233 | 234 | 235 | 1.8 236 | 237 | 242 | 243 | 244 | 245 | 246 | 247 | lib 248 | 249 | 254 | 255 | 256 | 257 | 258 | 259 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Change Log 2 | 3 | ### v0.1.3 (2017/12/14 20:29 +08:00) 4 | - [bd48a4c](https://github.com/madneal/everywhere/commit/bd48a4c3a49c9897afcf77ebe10a801582a13e16) display all results (@madneal) 5 | - [a41d0b5](https://github.com/madneal/everywhere/commit/a41d0b5f04c0a4367e69b7cef003ea4c0b27b5de) clear data when search test is empty :rocket: (@madneal) 6 | - [fd3451a](https://github.com/madneal/everywhere/commit/fd3451a6d900efe718faf2f53ff1d67326f98c72) update changelog :memo: (@madneal) 7 | - [3c23626](https://github.com/madneal/everywhere/commit/3c23626996fbb192fd93e7f015f9e73985ad238b) convert tan after index finished :lipstick: (@madneal) 8 | - [667ae57](https://github.com/madneal/everywhere/commit/667ae57f536c6421a35282dcea84502544357329) remove STDOUT :fire: (@madneal) 9 | - [1256f07](https://github.com/madneal/everywhere/commit/1256f0784d37be7aca08014e43a0eebf4e6da7e3) reduce System.out :zap: (@madneal) 10 | - [edb0746](https://github.com/madneal/everywhere/commit/edb0746f10ef8af039cfd975ff142d0c33416763) add addAll method (@madneal) 11 | - [a21f1e4](https://github.com/madneal/everywhere/commit/a21f1e4f656bc6cc5bf18d1569f218091b162e5f) modify MyArray (@madneal) 12 | - [b314249](https://github.com/madneal/everywhere/commit/b314249c4314ba60269bb370ac9fbcfee75d3ccb) add MyArray (@madneal) 13 | - [e6aa04c](https://github.com/madneal/everywhere/commit/e6aa04cff5b115b288595b87185975117f51967e) set PrintStream autoflush true (@madneal) 14 | - [446e105](https://github.com/madneal/everywhere/commit/446e10515149814ef3e67d91637e6561f5dddaa4) add GUIUtils :sparkles: (@madneal) 15 | - [c930167](https://github.com/madneal/everywhere/commit/c9301670f3acee75a25a80e53a53400c040c28f1) add about :rocket: (@madneal) 16 | - [96eb0db](https://github.com/madneal/everywhere/commit/96eb0db7d7f54b8157cf6daee25e05349f74b662) make conle texteara move down automatically :rocket: (@madneal) 17 | - [a88cfcc](https://github.com/madneal/everywhere/commit/a88cfccd2b4b7c02b01204281df41fe1db69ec8d) fix Chinese characters print in area encoding problem :bug: (@madneal) 18 | - [e5a55a5](https://github.com/madneal/everywhere/commit/e5a55a53eeb75519d7d83c6ff2b6d274bf674e19) add css for textarea :lipstick: (@madneal) 19 | - [ebd7398](https://github.com/madneal/everywhere/commit/ebd73982150205c6994c58223ba89ece6ad2a40e) add console display :rocket: (@madneal) 20 | - [fc8a992](https://github.com/madneal/everywhere/commit/fc8a992d66b0dd18682261992158074aca3e5999) add CHANGELOG :memo: (@madneal) 21 | - [114fcc6](https://github.com/madneal/everywhere/commit/114fcc6b80dc78d58878958c8055d381c5092547) remove exception try catch :fire: (@madneal) 22 | - [714a0d5](https://github.com/madneal/everywhere/commit/714a0d51b3c531b3b09dc0870a6ba891561c1fe8) add readSheet (@madneal) 23 | - [9a52248](https://github.com/madneal/everywhere/commit/9a52248fb570c637d932110a851546186d1e76cb) fix doc file which is docx essentially by add FileMagic :bug: (@madneal) 24 | - [15f062f](https://github.com/madneal/everywhere/commit/15f062fffa6592bc212a9852b140445453e78209) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 25 | - [1662a2e](https://github.com/madneal/everywhere/commit/1662a2e77c17c5b511cc9f9e820509089b874e3c) add lastmodified :rocket: (@madneal) 26 | - [75e33d9](https://github.com/madneal/everywhere/commit/75e33d91291ee885e63e1eae501beb5ebfac9632) Update README.md (@madneal) 27 | - [199be3a](https://github.com/madneal/everywhere/commit/199be3acc6b56fbc03ca188898b86d43cb2fe858) Update README.md (@madneal) 28 | - [a281fa2](https://github.com/madneal/everywhere/commit/a281fa230217008711236aaf9397611908f5bc22) add export ui jar picture (@madneal) 29 | - [eeaa41b](https://github.com/madneal/everywhere/commit/eeaa41b8d2803fa410749ba36d2611991f95c3b0) update download link (@madneal) 30 | 31 | ### v0.1.2 (2017/11/23 19:40 +08:00) 32 | - [6fd7e55](https://github.com/madneal/everywhere/commit/6fd7e55f4200d9c56fb5ca8c479b794899760dc4) add inputDataPath :rocket: (@madneal) 33 | - [ca4c262](https://github.com/madneal/everywhere/commit/ca4c2627226e7e53380ca24728b7ec811603209f) add runIndex by each filepath :rocket: (@madneal) 34 | - [c570560](https://github.com/madneal/everywhere/commit/c570560f07d9678450f3b4c9159c88354894a55c) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 35 | - [02166d2](https://github.com/madneal/everywhere/commit/02166d20daffedd9cdbef4a9098436a76d42b6e4) replace Highlighter with UnifiedHighlighter :zap: (@madneal) 36 | - [9bd3641](https://github.com/madneal/everywhere/commit/9bd3641b05502de9c0d0847f59979e1cc1c59970) remove replace \r in readTxt (@madneal) 37 | - [6a22b7c](https://github.com/madneal/everywhere/commit/6a22b7c1ab9b3679460492e3cfad841cf9111668) modify readTxt (@madneal) 38 | - [#2](https://github.com/madneal/everywhere/pull/2) Merge pull request #2 from develio/patch-1 (@develio) 39 | - [c7b4055](https://github.com/madneal/everywhere/commit/c7b405581f1998d968665d0dd21f1880f3d5806d) Typo (@develio) 40 | - [d277417](https://github.com/madneal/everywhere/commit/d2774178ace95134722de31251cdcfb45f7529bc) modify pom.xml (@madneal) 41 | - [a463d55](https://github.com/madneal/everywhere/commit/a463d55b5c1fac83c300f64c571b7be8af2b09eb) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 42 | - [5e2a4f2](https://github.com/madneal/everywhere/commit/5e2a4f2ecad3c72ac6e0562f7a4c0595d19e9d08) remove unnecessary files :art: (@madneal) 43 | - [31c3e47](https://github.com/madneal/everywhere/commit/31c3e470c84fa6093669fc615392af4478a0d3dd) add build exe explain (@madneal) 44 | - [ad4c5db](https://github.com/madneal/everywhere/commit/ad4c5dbc25e08092ff0b863ab016f6460007833a) Update README.md (@madneal) 45 | 46 | ### v0.1.1 (2017/11/19 21:14 +08:00) 47 | - [7b257ec](https://github.com/madneal/everywhere/commit/7b257ec8a1c562021c3535b9ceff214df70f585e) Update README.md (@madneal) 48 | - [e629bac](https://github.com/madneal/everywhere/commit/e629bac579b55ef3e6630eff2bd09a9e4f99fc6e) Update README.md (@madneal) 49 | - [848cc8f](https://github.com/madneal/everywhere/commit/848cc8fe9afeb6777e8e3391bad68ac76cfbd116) add gif link (@madneal) 50 | - [71fad57](https://github.com/madneal/everywhere/commit/71fad57561c9d231d0efb284e2081476841d9438) add environment requirements (@madneal) 51 | - [26654b6](https://github.com/madneal/everywhere/commit/26654b6d2321d6ccaa03d19f7b5c48a3e63df337) add advanced setting (@madneal) 52 | - [caa9269](https://github.com/madneal/everywhere/commit/caa92691d4586889c0644ccb977681cb22110bc1) fix in FileUtil (@madneal) 53 | - [dda3826](https://github.com/madneal/everywhere/commit/dda38268bfbe50977cba4b498467fca35239fdff) fix conflicts (@madneal) 54 | - [a95faad](https://github.com/madneal/everywhere/commit/a95faad9fb8dfe6b89e369dc89396003c1b414d2) fix deprecated toURL (@madneal) 55 | - [#1](https://github.com/madneal/everywhere/pull/1) Merge pull request #1 from madneal/dev (@madneal) 56 | - [b579f8e](https://github.com/madneal/everywhere/commit/b579f8ea6745575c928a80ced342ced332f6d96b) only click the current cell (@madneal) 57 | - [7786185](https://github.com/madneal/everywhere/commit/778618590d54c2faec796e32147104156887b222) remove target (@madneal) 58 | - [2f8bb50](https://github.com/madneal/everywhere/commit/2f8bb5045a5fb37d746d045d5438a1f26955e92c) add path query (@madneal) 59 | - [1d3e5ae](https://github.com/madneal/everywhere/commit/1d3e5aeeff9c0a45eb988acc1de2afad10133f1e) modify SearchedResult (@madneal) 60 | - [ce8a413](https://github.com/madneal/everywhere/commit/ce8a4135399af663770d82ba8cfc912b41c71c17) add search type combo (@madneal) 61 | - [3bde66a](https://github.com/madneal/everywhere/commit/3bde66adda787eb18ced3d47ad599e5f8c11f0c1) add links for main techniques (@madneal) 62 | - [a479d07](https://github.com/madneal/everywhere/commit/a479d0754a975a4aeaec99bb3a743236c6dc84fa) Update README.md (@madneal) 63 | 64 | ### v0.1 (2017/11/18 10:27 +08:00) 65 | - [82f43ef](https://github.com/madneal/everywhere/commit/82f43efee857733f87dafd02dfa821caf461510e) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 66 | - [5b80ec1](https://github.com/madneal/everywhere/commit/5b80ec1e05910075bfac98081b30ffac79e57c01) modify title in _config.yml (@madneal) 67 | - [10ef63a](https://github.com/madneal/everywhere/commit/10ef63a5ea4fd8540d88fad18b50c05bc07755a2) Update README.md (@madneal) 68 | - [ca8b438](https://github.com/madneal/everywhere/commit/ca8b43821dce2de92b89e790eaffc7b747305d78) Update README.md (@madneal) 69 | - [359a46d](https://github.com/madneal/everywhere/commit/359a46d7238615601ca93a292f1a0ca69f9db3e2) Update README.md (@madneal) 70 | - [457fb73](https://github.com/madneal/everywhere/commit/457fb73a50a76216f47fb697a4c4290ca85fdb0e) add usage (@madneal) 71 | - [c42f52f](https://github.com/madneal/everywhere/commit/c42f52ffe81c6c2a9283eec138a7bc85e3d7e828) add emoji plugin (@madneal) 72 | - [76b3a36](https://github.com/madneal/everywhere/commit/76b3a36f81da7b8ffeddaabcf2e620e4296ebbe8) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 73 | - [0b51e1f](https://github.com/madneal/everywhere/commit/0b51e1fad60458d058bc7a7bc098df38316ba4f6) seprate IndexWriter and IndexReader :sparkles: (@madneal) 74 | - [cd05ce8](https://github.com/madneal/everywhere/commit/cd05ce895f0ebcbe97c50d09dab0b7aa08980ae7) Set theme jekyll-theme-minimal (@madneal) 75 | - [ce073db](https://github.com/madneal/everywhere/commit/ce073dbfc7e015cd2c607d48097e5401ec344635) add index indication label :lipstick: (@madneal) 76 | - [300a2c1](https://github.com/madneal/everywhere/commit/300a2c11ffd575df7dc0d5a8713f79311dee6bfa) remove unnecessary code (@madneal) 77 | - [d4228c6](https://github.com/madneal/everywhere/commit/d4228c604b24047f05a623f17711abb2385ee6fc) remove unsignificant elements (@madneal) 78 | - [1413286](https://github.com/madneal/everywhere/commit/14132861f668441c8aaecd1e2262da73d01f5e7e) add log :rocket: (@madneal) 79 | - [4c8b545](https://github.com/madneal/everywhere/commit/4c8b5453a086f8b56d38f9d7e1beb4f5c25f4142) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 80 | - [00edc88](https://github.com/madneal/everywhere/commit/00edc882f7aa395117f29248fe1fa484d8fd6b04) move index button (@madneal) 81 | - [50c528b](https://github.com/madneal/everywhere/commit/50c528bc1f9d5150c3f44ffcf058b9fd73382959) Set theme jekyll-theme-slate (@madneal) 82 | - [3d3691f](https://github.com/madneal/everywhere/commit/3d3691f2a77d91d694399cf354d14e7dbd733d0f) Update README.md (@madneal) 83 | - [08008c4](https://github.com/madneal/everywhere/commit/08008c44c068e5f904c193f74e744a0ba88da1e3) Update README.md (@madneal) 84 | - [da0acfa](https://github.com/madneal/everywhere/commit/da0acfac0dba575f35d66656e5fb8c7928be9e72) add main techniques (@madneal) 85 | - [1a7fbc0](https://github.com/madneal/everywhere/commit/1a7fbc0648479d37fbfe239a1c7c70220bc8fb91) add open document :rocket: (@madneal) 86 | - [ac1633c](https://github.com/madneal/everywhere/commit/ac1633c9271deec772d8db8e40ed32de22cc2ee0) first valid for cell click (@madneal) 87 | - [865000c](https://github.com/madneal/everywhere/commit/865000c7d7d0cde78dcdb9373bbf0de9a6bb2c01) add file empty (@madneal) 88 | - [b8d5495](https://github.com/madneal/everywhere/commit/b8d5495957875bbbbfb617e773c2e3848a77c644) remove jars :fire: (@madneal) 89 | - [72655cb](https://github.com/madneal/everywhere/commit/72655cbea6f6affe0ee562851039c0e65da4e1cb) modify backspace :bug: (@madneal) 90 | - [da11b70](https://github.com/madneal/everywhere/commit/da11b70b3d1f6d411c1c13389c62ff03c3ca61f0) add open file function (@madneal) 91 | - [65ea50f](https://github.com/madneal/everywhere/commit/65ea50fcd57b81486bdf0ebd6a50dc29fc761311) add hyperlink (@madneal) 92 | - [b8dd7d4](https://github.com/madneal/everywhere/commit/b8dd7d48f408621b60de9fd066c2d0437a0b86cc) remove hello world :fire: (@madneal) 93 | - [78b03ef](https://github.com/madneal/everywhere/commit/78b03eff2df06d3b3459574d70552a1501632fad) remove comment :fire: (@madneal) 94 | - [97bc03b](https://github.com/madneal/everywhere/commit/97bc03b5313742ec634cdeb2828ce077364ef484) modify .gitignore (@madneal) 95 | - [52b0997](https://github.com/madneal/everywhere/commit/52b0997d26c1dc3cc045a1f9cd5ef3346c458c2c) remove out and target :fire: (@madneal) 96 | - [d92044e](https://github.com/madneal/everywhere/commit/d92044edac99527eb464cd1abf1954c8154cc699) modify .gitignoire (@madneal) 97 | - [32fbc56](https://github.com/madneal/everywhere/commit/32fbc5687340a3168be9047d239c6f2317dbfff6) remove index :fire: (@madneal) 98 | - [e899ef3](https://github.com/madneal/everywhere/commit/e899ef3851c4b97b0788cec45de586ddd0b89b81) add package build“ (@madneal) 99 | - [6d55553](https://github.com/madneal/everywhere/commit/6d55553f717be4f037c44d74c8b565d01969b688) rename .gitignore (@madneal) 100 | - [5d443ed](https://github.com/madneal/everywhere/commit/5d443eda3ee4618eb054a4964e774643810d62a5) remove .idea (@madneal) 101 | - [a946d63](https://github.com/madneal/everywhere/commit/a946d630dceb1592ea91a21d0ad880d2d21a8264) remove .idea (@madneal) 102 | - [e719965](https://github.com/madneal/everywhere/commit/e7199651f98e6f491c0455e94b930dfbbdb19f7f) finish the tableview :lipstick: (@madneal) 103 | - [3881d54](https://github.com/madneal/everywhere/commit/3881d543446fdd9f5516dcbc1e7610ee99c7283d) remove .idea :fire: (@madneal) 104 | - [daee925](https://github.com/madneal/everywhere/commit/daee925e67aeb83c21b88742a1965b61fc04530b) remove .idea :fire: (@madneal) 105 | - [de1f3eb](https://github.com/madneal/everywhere/commit/de1f3eb09f5b300b2e36972aae97007734a06347) modify search field PATH (@madneal) 106 | - [ded4021](https://github.com/madneal/everywhere/commit/ded402111c07a4b388ef060b001d39b2b94eacaf) still not finished the search :bug: (@madneal) 107 | - [d8cc26d](https://github.com/madneal/everywhere/commit/d8cc26d5d8f489d4e7cea5db1e3a939701f30578) modify cannot input Chinese in TextField :bug: (@madneal) 108 | - [e9e12d6](https://github.com/madneal/everywhere/commit/e9e12d6081d97ddad431f0452a48bb85a5838123) modify ignore (@madneal) 109 | - [1b7e558](https://github.com/madneal/everywhere/commit/1b7e558d7df6cc479b5437e5d0c708f54d651b7f) modify search (@madneal) 110 | - [1c29d42](https://github.com/madneal/everywhere/commit/1c29d4226128a88083695de08e47389716b3a0f7) add SearchedResult (@madneal) 111 | - [fed82dc](https://github.com/madneal/everywhere/commit/fed82dc2423ff9e93fd383f01b0b010c42c3690d) modify .gitignore (@madneal) 112 | - [5f9fc25](https://github.com/madneal/everywhere/commit/5f9fc251b4dd530e8a6240cddcd70563158fcf65) modify SearchUtil (@madneal) 113 | - [ac43019](https://github.com/madneal/everywhere/commit/ac430198d4067963d5be77ad9d5d7e24a9f15547) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 114 | - [dbb976e](https://github.com/madneal/everywhere/commit/dbb976ef67071b2e3b6f6e614c97f5efd94e1a47) remove target :fire: (@madneal) 115 | - [78d306f](https://github.com/madneal/everywhere/commit/78d306fe1acb0219a44371dc61d6af2e313c0536) Update .gitnignore (@madneal) 116 | - [1810070](https://github.com/madneal/everywhere/commit/1810070e475e32ecf03cdb2e9d14f8628a52b94d) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 117 | - [3c35d74](https://github.com/madneal/everywhere/commit/3c35d74b11018395f567e8735348076df8fc70c9) remove out :fire: (@madneal) 118 | - [f3f00ba](https://github.com/madneal/everywhere/commit/f3f00baa7b4b43232b72b106c66322ca4928ea8d) Update .gitnignore (@madneal) 119 | - [32c36ec](https://github.com/madneal/everywhere/commit/32c36eca1c77bde50199f2fd8cac330e3652fc7c) add SearchResult :sparkles: (@madneal) 120 | - [1f00ee1](https://github.com/madneal/everywhere/commit/1f00ee19f16defff3195c8f3db8bbe2a1cb9be24) modfiy searchType (@madneal) 121 | - [279a509](https://github.com/madneal/everywhere/commit/279a509201209380808aef5ed02f1977ca689320) add inputchange (@madneal) 122 | - [05d9c50](https://github.com/madneal/everywhere/commit/05d9c50211d785252824239f2541ad09c3525dbd) add Controller (@madneal) 123 | - [1f5f573](https://github.com/madneal/everywhere/commit/1f5f57344a2a80077c0de1eb5f97542e2e9af237) add config :wrench: (@madneal) 124 | - [e7e6169](https://github.com/madneal/everywhere/commit/e7e61699871d0f424dd971360d032baccc3aa8a2) remove out folder :fire: (@madneal) 125 | - [273b36f](https://github.com/madneal/everywhere/commit/273b36f0d3272ce4d0cdcbb67d8e1030cc062aaf) Create .gitnignore (@madneal) 126 | - [7c749a5](https://github.com/madneal/everywhere/commit/7c749a5143d382f892bf4258282a1210b98b38ad) add windows :lipstick: (@madneal) 127 | - [2f9d35b](https://github.com/madneal/everywhere/commit/2f9d35b112db502c96c95b0574b73f93a43ea6a0) modify sample.fxml (@madneal) 128 | - [a63df60](https://github.com/madneal/everywhere/commit/a63df6025de678d12dfb342f2026591db437f746) add ui :rocket: (@madneal) 129 | - [e363c30](https://github.com/madneal/everywhere/commit/e363c30d92ab1c1fe51fb0a8a294c5ad4731d312) almost finish search :rocket: (@madneal) 130 | - [a7cc6fd](https://github.com/madneal/everywhere/commit/a7cc6fd89619dae14dfeb6c30800ca6d85c4e89c) finish FileUtil (@madneal) 131 | - [1b2843a](https://github.com/madneal/everywhere/commit/1b2843ae24b62785e681f30d4120655a8d4eac61) add dependecies :arrow_up: (@madneal) 132 | - [4c85ad4](https://github.com/madneal/everywhere/commit/4c85ad4946feab115f2352b14b32d0deb5af7f65) add dependency :arrow_up: (@madneal) 133 | - [1fa05eb](https://github.com/madneal/everywhere/commit/1fa05eb4e7e1aab27b0d9543eb746798740f66bb) add modules :arrow_up: (@madneal) 134 | - [d102017](https://github.com/madneal/everywhere/commit/d10201763de9819453d178a6b11dcddd94082762) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal) 135 | - [f3283e5](https://github.com/madneal/everywhere/commit/f3283e56ba01ebb5e5f2f0b2e0d4000d307d9ab3) initial the project :tada: (@madneal) 136 | - [f1848cd](https://github.com/madneal/everywhere/commit/f1848cd610721b2ae6de9af619be97d91f848af3) Initial commit (@madneal) --------------------------------------------------------------------------------