- corrected layout of map preview

- added caption to maps containing latitude and longitude information
- prevented that maps occur on second search page
- added location names to did-you-mean
- some refactoring of did-you-mean
- added equal and compareTo test to Coordinates class to make that work in set
- fixed utf-8 support for library files
- fixed a bug in images search icon view caption

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@6294 6c8d7289-2bf4-0310-a012-ef5d649a1542
This commit is contained in:
orbiter 2009-09-04 23:33:47 +00:00
parent 4b83875abd
commit eaddf2d464
9 changed files with 99 additions and 49 deletions

View File

@ -133,12 +133,16 @@ document.getElementById("Enter").value = "search again";
<div class="searchresults">
<h4 class="linktitle">
<img src="http://www.openstreetmap.org/favicon.ico" class="favicon" style="width:16px; height:16px;" alt="" />
Location (click to enlarge)</h4>
Location -- click on map to enlarge</h4>
<p class="url">
#{loc}#
<div style="margin: 20px; width: 100px; float: left;">
<a href="/osm.png?lon=#[lon]#&lat=#[lat]#&zoom=14" class="thumblink" style="float:left;" onclick="return hs.expand(this)">
<img src="/osm.png?lon=#[lon]#&lat=#[lat]#&zoom=14" width="768" height="768">
<img src="/osm.png?lon=#[lon]#&lat=#[lat]#&zoom=14" width="192" height="192">
</a>
<div class="highslide-caption">lat=#[lat]#, lon=#[lon]#</div>
<div class="TableCellDark">lat=#[lat]#,<br />lon=#[lon]#</div>
</div>
#{/loc}#
</p>
<p class="urlinfo" style="clear:left;">Geographic information provided by <a href="http://opengeodb.hoppe-media.com">OpenGeoDB</a>, Map provided by <a href="http://www.openstreetmap.org">OpenStreetMap</a></p>

View File

@ -521,14 +521,15 @@ public class yacysearch {
// find geographic info
Set<Coordinates> coordinates = LibraryProvider.geoDB.find(originalquerystring);
if (coordinates == null || coordinates.size() == 0) {
if (coordinates == null || coordinates.size() == 0 || offset > 0) {
prop.put("geoinfo", "0");
} else {
int i = 0;
for (Coordinates c: coordinates) {
prop.put("geoinfo_loc_" + i + "_lon", c.lon());
prop.put("geoinfo_loc_" + i + "_lat", c.lat());
prop.put("geoinfo_loc_" + i + "_lon", Math.round(c.lon() * 10000.0) / 10000.0);
prop.put("geoinfo_loc_" + i + "_lat", Math.round(c.lat() * 10000.0) / 10000.0);
i++;
if (i >= 5) break;
}
prop.put("geoinfo_loc", i);
prop.put("geoinfo", "1");

View File

@ -25,7 +25,7 @@
<a href="#[hrefCache]#" class="thumblink" onclick="return hs.expand(this)">
<img src="/ViewImage.png?maxwidth=96&amp;maxheight=96&amp;code=#[code]#" alt="#[name]#" />
</a>
<div class="highslide-caption"><a href="#[href]#">#[name]#<br \><a href="#[source]#">#[sourcedom]#</a></a></div>
<div class="highslide-caption"><a href="#[href]#">#[name]#</a><br \><a href="#[source]#">#[sourcedom]#</a></div>
<div class="TableCellDark"><a href="#[href]#">#[name]#</a><br \>#[attr]#</div>
</div>
#{/items}#

View File

@ -26,8 +26,10 @@
package de.anomic.data;
public class Coordinates {
public class Coordinates implements Comparable<Coordinates> {
private static final double tenmeter = 90.0 / 1.0e6;
private double lon, lat;
public Coordinates(double lon, double lat) {
@ -52,12 +54,37 @@ public class Coordinates {
/**
* compute the hash code of a coordinate
* this produces identical hash codes for locations that are close to each other on longitude
* this produces identical hash codes for locations that are close to each other
*/
public int hashCode() {
int lon1 = coord2int(this.lon) >> 15;
int lat1 = coord2int(this.lat) >> 15;
return (lon1 << 15) | lat1;
int h = (lon1 << 15) + lat1;
System.out.println("lon=" + this.lon + ", lat=" + this.lat + ", hash=" + h);
return h;
}
/**
* comparator that is needed to use the class inside TreeMap/TreeSet
*/
public int compareTo(Coordinates o) {
if (this.equals(o)) return 0;
int s = this.hashCode();
int t = o.hashCode();
if (s > t) return 1;
if (s < t) return -1;
return 0;
}
/**
* equality test that is needed to use the class inside HashMap/HashSet
*/
public boolean equals(Object o) {
if (!(o instanceof Coordinates)) return false;
Coordinates oo = (Coordinates) o;
if (this.lon == oo.lon && this.lat == oo.lat) return true;
// we access fuzzy values that are considered as equal if they are close to each other
return Math.abs(this.lon - oo.lon) < tenmeter && Math.abs(this.lat - oo.lat) < tenmeter;
}
public String toString() {

View File

@ -152,6 +152,14 @@ public class DidYouMean {
return this.resultSet;
}
public void test(String s) throws InterruptedException {
Set<String> libr = LibraryProvider.dymLib.recommend(s);
libr.addAll(LibraryProvider.geoDB.recommend(s));
if (libr.size() != 0) createGen = false;
for (String t: libr) guessLib.put(t);
if (createGen) guessGen.put(s);
}
/**
* DidYouMean's producer thread that changes one letter (e.g. bat/cat) for a given term
@ -161,15 +169,9 @@ public class DidYouMean {
public class ChangingOneLetter extends Thread {
public void run() {
String s;
Set<String> libr;
for (int i = 0; i < wordLen; i++) try {
for (char c: alphabet) {
s = word.substring(0, i) + c + word.substring(i + 1);
libr = LibraryProvider.dymLib.recommend(s);
if (libr.size() != 0) createGen = false;
for (String t: libr) guessLib.put(t);
if (createGen) guessGen.put(s);
test(word.substring(0, i) + c + word.substring(i + 1));
if (System.currentTimeMillis() > timeLimit) return;
}
} catch (InterruptedException e) {}
@ -184,14 +186,8 @@ public class DidYouMean {
protected class DeletingOneLetter extends Thread {
public void run() {
String s;
Set<String> libr;
for (int i = 0; i < wordLen; i++) try {
s = word.substring(0, i) + word.substring(i+1);
libr = LibraryProvider.dymLib.recommend(s);
if (libr.size() != 0) createGen = false;
for (String t: libr) guessLib.put(t);
if (createGen) guessGen.put(s);
test(word.substring(0, i) + word.substring(i+1));
if (System.currentTimeMillis() > timeLimit) return;
} catch (InterruptedException e) {}
}
@ -205,15 +201,9 @@ public class DidYouMean {
protected class AddingOneLetter extends Thread {
public void run() {
String s;
Set<String> libr;
for (int i = 0; i <= wordLen; i++) try {
for (char c: alphabet) {
s = word.substring(0, i) + c + word.substring(i);
libr = LibraryProvider.dymLib.recommend(s);
if (libr.size() != 0) createGen = false;
for (String t: libr) guessLib.put(t);
if (createGen) guessGen.put(s);
test(word.substring(0, i) + c + word.substring(i));
if (System.currentTimeMillis() > timeLimit) return;
}
} catch (InterruptedException e) {}
@ -228,14 +218,8 @@ public class DidYouMean {
protected class ReversingTwoConsecutiveLetters extends Thread {
public void run() {
String s;
Set<String> libr;
for (int i = 0; i < wordLen - 1; i++) try {
s = word.substring(0, i) + word.charAt(i + 1) + word.charAt(i) + word.substring(i +2);
libr = LibraryProvider.dymLib.recommend(s);
if (libr.size() != 0) createGen = false;
for (String t: libr) guessLib.put(t);
if (createGen) guessGen.put(s);
test(word.substring(0, i) + word.charAt(i + 1) + word.charAt(i) + word.substring(i +2));
if (System.currentTimeMillis() > timeLimit) return;
} catch (InterruptedException e) {}
}

View File

@ -28,13 +28,15 @@ package de.anomic.data;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.zip.GZIPInputStream;
/**
* provide a completion library for the did-you-mean class
@ -68,14 +70,16 @@ public class DidYouMeanLibrary {
for (String f: files) {
if (f.endsWith(".words")) try {
importFile(new File(dictionaryPath, f));
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void importFile(File f) throws FileNotFoundException {
BufferedReader r = new BufferedReader(new FileReader(f));
private void importFile(File f) throws IOException {
InputStream is = new FileInputStream(f);
if (f.getName().endsWith(".gz")) is = new GZIPInputStream(is);
BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String l;
try {
while ((l = r.readLine()) != null) {

View File

@ -70,9 +70,21 @@ public class LibraryProvider {
}
public static void integrateOpenGeoDB() {
File ogdb = new File(dictSource, "opengeodb-0.2.5a-UTF8-sql.gz"); // may also be named opengeodb-02513_2007-10-02.sql.gz
if (!ogdb.exists()) return;
geoDB = new OpenGeoDB(ogdb);
File ogdb = new File(dictSource, "opengeodb-0.2.5a-UTF8-sql.gz");
if (ogdb.exists()) {
geoDB = new OpenGeoDB(ogdb);
return;
}
ogdb = new File(dictSource, "opengeodb-02513_2007-10-02.sql.gz");
if (ogdb.exists()) {
geoDB = new OpenGeoDB(ogdb);
return;
}
ogdb = new File(dictSource, "opengeodb-02513_2007-10-02.sql");
if (ogdb.exists()) {
geoDB = new OpenGeoDB(ogdb);
return;
}
}
public static void initDidYouMean() {
@ -140,7 +152,7 @@ public class LibraryProvider {
final ArrayList<String> list = new ArrayList<String>();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line;
// read until text starts

View File

@ -38,6 +38,9 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.zip.GZIPInputStream;
@ -85,7 +88,7 @@ public class OpenGeoDB {
try {
InputStream is = new FileInputStream(file);
if (file.getName().endsWith(".gz")) is = new GZIPInputStream(is);
reader = new BufferedReader(new InputStreamReader(is));
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line;
// read lines
@ -180,4 +183,18 @@ public class OpenGeoDB {
return a;
}
/**
* read the dictionary and construct a set of recommendations to a given string
* @param s input value that is used to match recommendations
* @return a set that contains all words that start or end with the input value
*/
public Set<String> recommend(String s) {
Set<String> a = new HashSet<String>();
s = s.trim().toLowerCase();
SortedMap<String, List<Integer>> t = this.locationName2ids.tailMap(s);
for (String r: t.keySet()) {
if (r.startsWith(s)) a.add(r); else break;
}
return a;
}
}

View File

@ -36,6 +36,7 @@ import java.util.Random;
import javax.imageio.ImageIO;
import de.anomic.crawler.CrawlProfile;
import de.anomic.crawler.retrieval.Response;
import de.anomic.http.client.Cache;
import de.anomic.search.Switchboard;
@ -77,13 +78,13 @@ public class ymageOSM {
} catch (final MalformedURLException e) {
return null;
}
System.out.println("*** DEBUG: fetching OSM tile: " + tileURL.toNormalform(true, true));
//System.out.println("*** DEBUG: fetching OSM tile: " + tileURL.toNormalform(true, true));
InputStream tileStream = Cache.getContentStream(tileURL);
if (tileStream == null) {
// download resource using the crawler and keep resource in memory if possible
Response entry = null;
try {
entry = Switchboard.getSwitchboard().loader.load(tileURL, false, false);
entry = Switchboard.getSwitchboard().loader.load(tileURL, false, false, CrawlProfile.CACHE_STRATEGY_IFEXIST);
} catch (IOException e) {
Log.logWarning("yamyOSM", "cannot load: " + e.getMessage());
return null;